[解決済み] Angular 2で相対パスが非常に長いインポートを回避する方法とは?
質問
のようなものを導入するにはどうすればよいのでしょうか?
'my-app-name/services'
のようなものを導入して、次のimportのような行を避けるにはどうしたらよいでしょうか?
import {XyService} from '../../../services/validation/xy.service';
どのように解決するのですか?
TypeScript 2.0以上
TypeScript 2.0では、TypeScript 2.0に含まれる文字列の中に
baseUrl
プロパティに
tsconfig.json
:
{
"compilerOptions": {
"baseUrl": "."
// etc...
},
// etc...
}
そうすると、あたかもベースディレクトリにいるように、すべてをインポートすることができます。
import {XyService} from "services/validation/xy.service";
この上に
paths
プロパティを追加することで、パターンにマッチしてからそれをマップすることができます。例えば
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"services/*": [
"services/validation/*"
]
}
// etc...
},
// etc...
}
というように、どこからでもインポートできるようになります。
import {XyService} from "services/xy.service";
ここから、使用しているモジュールローダーがこれらのimport名をサポートするように設定する必要がある。今のところ、TypeScriptコンパイラーは自動的にこれらをマッピングしてくれないようだ。
これについては
github issue
. また
rootDirs
プロパティもあり、これは複数のプロジェクトを使用する場合に便利です。
TypeScript 2.0以前(TS 2.0以上でも適用可能です。)
を使うことでより簡単にできることがわかりました。 "バレルズ" .
-
各フォルダー内に
index.ts
ファイルを作成します。 - これらのファイルの中で、フォルダ内の各ファイルを再エクスポートします。
例
あなたの場合、まず
my-app-name/services/validation/index.ts
. このファイルの中に、コードを用意してください。
export * from "./xy.service";
というファイルを作成します。
my-app-name/services/index.ts
というファイルを作成し、このようなコードを用意します。
export * from "./validation";
これで、以下のようにサービスを利用することができます (
index
は暗黙の了解です)。
import {XyService} from "../../../services";
そして、そこに複数のファイルがあると、さらに簡単になります。
import {XyService, MyOtherService, MyOtherSerivce2} from "../../../services";
これらの余分なファイルを維持することは、最初の作業が少し増えます (その作業を省くには バレルメンテナ を使えば不要になります)、しかし最終的には少ない労力で元が取れることがわかりました。ディレクトリ構造の大きな変更を行うのがはるかに簡単で、行わなければならないインポートの数を減らすことができます。
注意
これを行う場合、いくつか注意しなければならないこと、してはいけないことがあります。
- 循環的な再エクスポートに注意する必要があります。したがって、2 つのサブフォルダー内のファイルが互いに参照し合う場合、フル パスを使用する必要があります。
-
同じ元のフォルダからフォルダを遡るべきではありません (例: 検証フォルダのファイルにいるときに
import {XyService} from "../validation";
). これと最初のポイントは、インポートが定義されていないというエラーにつながる可能性があることを発見しました。 - 最後に、同じ名前を持つ2つのエクスポートをサブフォルダ内に持つことはできません。通常、それは問題ではありませんが。
関連
-
[解決済み] ngModel' は 'input' の既知のプロパティではないため、バインドできません。
-
[解決済み] Angular:*ngClassを使った条件付きクラス
-
[解決済み] JavaScriptでデフォルトのインポートのエイリアスを作成するにはどうすればよいですか?
-
[解決済み] モジュール 'module-name' の宣言ファイルが見つかりませんでした。'/path/to/module-name.js' は暗黙のうちに 'any' 型を持っています。
-
[解決済み] オブジェクトのキーと値に*ngForでアクセスする
-
[解決済み] TypeScriptのオブジェクトリテラルでの型定義
-
[解決済み] Angular 2の "select "で新しい選択範囲を取得するにはどうすればよいですか?
-
[解決済み】AngularでjQueryを使用するには?
-
[解決済み】Angularでルーティングパスを通してデータを送信する
-
[解決済み】tsconfig.jsonでパスを使用する方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Typescriptエクスポートとデフォルトエクスポートの比較
-
[解決済み] TypeScriptの予約語 "type "とは何ですか?
-
[解決済み] Angular 2でアプリ起動時にサービスを実行する方法
-
[解決済み] Typescript のプリミティブ型:"number" と "Number" の違い(TSC は大文字と小文字を区別しない)?
-
[解決済み] タイプスクリプトのパイプ(|)の意味とは?
-
[解決済み] typescriptでmoment.jsをインポートするには?
-
[解決済み] TypeScript Genericsに複数の型制約を指定することは可能か?
-
[解決済み] Typescriptで<T>は何を意味するのですか?
-
[解決済み] typescriptで非推奨のマークを付けることは可能ですか?
-
[解決済み] Typescript でエラーをスローする関数を宣言する方法