'my-app-name/services'
のようなものを導入して、次のインポートのような行を避けるにはどうすればよいですか?
import {XyService} from '../../../services/validation/xy.service';
TypeScript 2.0では、tsconfig.json
にbaseUrl
プロパティを追加できます。
{
"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";
そこから、これらのインポート名をサポートするために使用しているモジュールローダーを設定する必要があります。現在、TypeScriptコンパイラはこれらを自動的にマップするようには見えません。
詳細については、 github issue をご覧ください。複数のプロジェクトを使用する場合に便利なrootDirs
プロパティもあります。
"barrels" を使用すると簡単にできることがわかりました。
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";
これらの余分なファイルを維持する必要があるため、前もってもう少し作業が必要になります( barrel-maintainer を使用して作業を削除できます)が、最終的には少ない作業で成果が得られることがわかりました。主要なディレクトリ構造の変更を行うのがはるかに簡単であり、必要なインポートの数が削減されます。
注意
これを行うとき、注意しなければならないことができないいくつかのことがあります:
import {XyService} from "../validation";
を実行)。私はこれを発見しました、そして最初の点は定義されていないインポートのエラーにつながる可能性があります。Tsconfig.jsonで以下の構成を使用する方が良い
{
"compilerOptions": {
"...": "reduced for brevity",
"baseUrl": "src",
"paths": {
"@app/*": ["app/*"]
}
}
}
Angular 6以前の従来の方法:
`import {XyService} from '../../../services/validation/xy.service';`
これらにリファクタリングする必要があります:
import {XyService} from '@app/services/validation/xy.service
短くて甘い!
私はちょうどこの質問に出くわしました。私はそれが今の方法であることを知っていますが、それに出くわした人にとっては、より簡単な答えがあります。
長い間やっていたことが機能しなくなったために出くわし、Angular 7で何かが変わったのではないかと思っていました。
にもかかわらず、tsconfig.json
の1行を変更するだけで、長いインポートパスが回避されます。
{
"compilerOptions": {
"...": "simplified for brevity",
"baseUrl": "src"
}
}
これは、Angular-CLIが登場して以来、ほとんど私にとってはうまくいきました。