consistent-type-imports
型インポートの一貫した使用を強制します。
このルールによって報告されるいくつかの問題は、 --fix
ESLintコマンドラインオプションで自動的に修正できます。.
TypeScriptでは、インポートにtype
キーワードを指定して、エクスポートがランタイムではなく型システムにのみ存在することを示すことができます。これにより、トランスパイラーは依存関係の型を知らなくてもインポートを削除できます。
詳細については、ブログ > 型のエクスポートとインポートの一貫性:理由と方法を参照してください。
module.exports = {
"rules": {
"@typescript-eslint/consistent-type-imports": "error"
}
};
Playgroundでこのルールを試す↗
オプション
このルールは次のオプションを受け入れます
type Options = [
{
disallowTypeAnnotations?: boolean;
fixStyle?: 'inline-type-imports' | 'separate-type-imports';
prefer?: 'no-type-imports' | 'type-imports';
},
];
const defaultOptions: Options = [
{
prefer: 'type-imports',
disallowTypeAnnotations: true,
fixStyle: 'separate-type-imports',
},
];
prefer
このオプションは、型のみのインポートに期待されるインポートの種類を定義します。prefer
の有効な値は次のとおりです。
type-imports
は、デコレーターのメタデータによって参照される場合を除き、常にimport type Foo from '...'
を使用することを強制します。これがデフォルトです。no-type-imports
は、常にimport Foo from '...'
を使用することを強制します。
{prefer: 'type-imports'}
の場合の正しいコードの例、および{prefer: 'no-type-imports'}
の場合の不正なコードの例。
import type { Foo } from 'Foo';
import type Bar from 'Bar';
type T = Foo;
const x: Bar = 1;
Playgroundで開く{prefer: 'type-imports'}
の場合の不正なコードの例、および{prefer: 'no-type-imports'}
の場合の正しいコードの例。
import { Foo } from 'Foo';
import Bar from 'Bar';
type T = Foo;
const x: Bar = 1;
Playgroundで開くfixStyle
このオプションは、インポートが型位置でのみ使用されていると検出された場合に追加される、期待される型修飾子を定義します。fixStyle
の有効な値は次のとおりです。
separate-type-imports
は、インポートキーワードの後にtypeキーワードを追加しますimport type { A } from '...'
。これがデフォルトです。inline-type-imports
は、typeキーワードをインライン化しますimport { type A } from '...'
。TypeScript 4.5以降でのみ使用可能です。 ここにあるドキュメントを参照してください。
- ❌ 不正
- ✅ `separate-type-imports`の場合
- ✅ `inline-type-imports`の場合
import { Foo } from 'Foo';
import Bar from 'Bar';
type T = Foo;
const x: Bar = 1;
Playgroundで開くimport type { Foo } from 'Foo';
import type Bar from 'Bar';
type T = Foo;
const x: Bar = 1;
Playgroundで開くimport { type Foo } from 'Foo';
import type Bar from 'Bar';
type T = Foo;
const x: Bar = 1;
Playgroundで開くdisallowTypeAnnotations
true
の場合、型注釈(import()
)での型インポートは許可されません。デフォルトはtrue
です。
{disallowTypeAnnotations: true}
の場合の不正なコードの例
type T = import('Foo').Foo;
const x: import('Bar') = 1;
Playgroundで開く注意点:@decorators
+ experimentalDecorators: true
+ emitDecoratorMetadata: true
experimentalDecorators: false
(例:TypeScript v5.0の安定したデコレーター)を使用している場合、ルールは期待どおりに常にエラーを報告します。この注意点は、experimentalDecorators: true
にのみ適用されます。
experimentalDecorators
とemitDecoratorMetadata
の両方がオンになっている場合、ルールはデコレーターを含むファイルではエラーを報告しません。
詳細については、ブログ > レガシーデコレーターとデコレーターメタデータで使用する場合のconsistent-type-importsの変更を参照してください。
型対応のlintingを使用している場合、tsconfigから設定が自動的に推論されるため、何も設定する必要はありません。それ以外の場合は、コンパイラーオプションがオンになっているかのようにコードを分析するようにツールに明示的に指示できます。parserOptions.emitDecoratorMetadata = true
とparserOptions.experimentalDecorators = true
の両方を設定してください。
importsNotUsedAsValues
/ verbatimModuleSyntax
との比較
verbatimModuleSyntax
は、TypeScript v5.0で導入されました(importsNotUsedAsValues
の代替として)。このルールとverbatimModuleSyntax
は、ほぼ同じように動作します。いくつかの動作の違いがあります。
状況 | consistent-type-imports (ESLint) | verbatimModuleSyntax (TypeScript) |
---|---|---|
未使用のインポート | 無視されます(@typescript-eslint/no-unused-vars の使用を検討してください) | 型エラー |
emitDecoratorMetadata とexperimentalDecorations との使用 | デコレーターを含むファイルを無視します | デコレーターを含むファイルについて報告します |
検出されたエラー | tsc ビルドに失敗しません。--fix で自動修正できます | tsc ビルドに失敗します。コマンドラインで自動修正できません |
import { type T } from 'T'; | TypeScriptは何も出力しません(インポートを「省略」します) | TypeScriptはimport {} from 'T' を出力します |
いくつかの違いがあるため、このルールとverbatimModuleSyntax
の両方を同時に使用すると、エラーが競合する可能性があります。そのため、どちらか一方のみを使用することをお勧めします。両方を同時に使用することは避けてください。
使用しない場合
スタイルの理由で両方のインポートの種類を具体的に使用したい場合、またはどちらかのスタイルを強制したくない場合は、このルールを避けることができます。
ただし、スタイルの不整合はプロジェクトの可読性を損なう可能性があることに注意してください。プロジェクトに最適なこのルールに1つのオプションを選択することをお勧めします。
関連事項
no-import-type-side-effects
import/consistent-type-specifier-style
{"prefer-inline": true}
を使用したimport/no-duplicates