@typescript-eslint/parser
TypeScriptコードをESLint互換のノードにパースし、バックエンドのTypeScriptプログラムを提供するために使用されるESLintパーサーです。✨
これは、TypeScriptがESLintの動作に必要なものとは異なる、非互換のAST形式を生成するため、必要になります。例えば、これは`:number`型注釈を含んでいるため、有効なJavaScriptコードではありません。
let x: number = 1;
ESLintのネイティブEspreeパーサーは、これをパースしようとするとエラーを発生させます。
さらに、TypeScriptはESLint、ESTree、Espreeとは別に、異なる目標を持って開発されているため、そのASTも多くの場合、ノードを異なる方法で表現しています。TSのASTは、不完全なコードのパースと型チェックというユースケースに合わせて最適化されています。ESTreeは最適化されておらず、「汎用」のASTトラバーサルユースケースを意図しています。
typescript-eslint playgroundの右側のサイドバーで、ESTreeを選択することで`@typescript-eslint/parser`を選択できます。
設定
以下の追加設定オプションは、ESLint設定ファイルのparserOptions
で指定することで利用できます。
interface ParserOptions {
allowAutomaticSingleRunInference?: boolean;
cacheLifetime?: {
glob?: number | 'Infinity';
};
ecmaFeatures?: {
jsx?: boolean;
globalReturn?: boolean;
};
ecmaVersion?: number | 'latest';
emitDecoratorMetadata?: boolean;
experimentalDecorators?: boolean;
extraFileExtensions?: string[];
jsDocParsingMode?: 'all' | 'none' | 'type-info';
jsxFragmentName?: string | null;
jsxPragma?: string | null;
lib?: string[];
programs?: import('typescript').Program[];
project?: string | string[] | boolean | null;
projectFolderIgnoreList?: string[];
tsconfigRootDir?: string;
warnOnUnsupportedTypeScriptVersion?: boolean;
EXPERIMENTAL_useProjectService?: boolean;
}
allowAutomaticSingleRunInference
デフォルトは
process.env.TSESTREE_SINGLE_RUN
またはfalse
です。
ESLintが単一実行の一部として使用されているかどうか(`--fix`モードまたはエディター拡張機能などの永続的なセッションとは対照的に)を推論するために、一般的なヒューリスティックを使用するかどうかを指定します。
typescript-eslintが型情報を使用したリンティングのために、TypeScriptプログラムの管理をバックグラウンドで行う場合、この区別はパフォーマンスにとって重要です。長期間実行されるユースケースに必要なTypeScript「ウォッチ」プログラムの管理には、大きなオーバーヘッドがあります。単一実行の場合を想定できることで、typescript-eslintはより高速な不変のプログラムを使用できます。
この設定のデフォルト値は、TSESTREE_SINGLE_RUN
環境変数を"false"
または"true"
に設定することで指定できます。例えば、TSESTREE_SINGLE_RUN=true npx eslint .
とすると有効になります。
allowAutomaticSingleRunInference
によって、CIでのリンティング速度が最大10〜20%向上することが確認されています。今後のメジャーバージョンではallowAutomaticSingleRunInference
をデフォルトで有効にする予定です。
cacheLifetime
このオプションを使用すると、内部キャッシュの有効期限の長さを詳細に制御できます。
秒数を整数で指定するか、キャッシュを期限切れにしない場合は文字列 'Infinity' を指定できます。
デフォルトでは、キャッシュエントリは30秒後に削除されるか、パーサーが単一実行であると推論した場合(allowAutomaticSingleRunInference
を参照)、無期限に保持されます。
ecmaFeatures
生の構文を解析する方法を記述するためのオプションの追加オプション。
jsx
デフォルトは
false
です。
true
の場合、JSXの解析を有効にします。TypeScriptハンドブックのJSXドキュメントで詳細を確認できます。
注記:この設定は、既知のファイルタイプ(.js
、.mjs
、.cjs
、.jsx
、.ts
、.mts
、.cts
、.tsx
、.json
)には影響しません。TypeScriptコンパイラには、既知のファイル拡張子に対する独自の内部処理があるためです。
正確な動作は以下のとおりです。
.js
、.mjs
、.cjs
、.jsx
、.tsx
ファイルは、これがtrue
であるかのように常に解析されます。.ts
、.mts
、.cts
ファイルは、これがfalse
であるかのように常に解析されます。- 「不明」な拡張子(
.md
、.vue
)の場合parserOptions.project
が指定されていない場合- 設定が尊重されます。
parserOptions.project
が指定されている場合(つまり、型情報を使用するルールを使用している場合)- 常にこれが
false
であるかのように解析されます。
- 常にこれが
globalReturn
デフォルトは
false
です。
このオプションを使用すると、コードベースでグローバルなreturn
ステートメントを許可するかどうかをパーサーに指示できます。
ecmaVersion
デフォルトは
2018
です。
有効なECMAScriptバージョン番号または'latest'
を受け入れます。
- バージョン:es3、es5、es6、es7、es8、es9、es10、es11、es12、es13、…、または
- 西暦:es2015、es2016、es2017、es2018、es2019、es2020、es2021、es2022、…、または
'latest'
バージョンまたは西暦の場合は、値は必ず数値にする必要があります。そのため、es
プレフィックスを含めないでください。
使用するECMAScript構文のバージョンを指定します。これは、パーサーがスコープ分析を実行する方法を決定するために使用され、デフォルトに影響します。
emitDecoratorMetadata
デフォルトは
undefined
です。
このオプションを使用すると、tsconfig.json
でemitDecoratorMetadata: true
が設定されているかのようにパーサーに動作させることができますが、型を意識したリンティングは行いません。つまり、この場合はparserOptions.project
を指定する必要がなくなり、リンティングプロセスが高速化されます。
experimentalDecorators
デフォルトは
undefined
です。
このオプションを使用すると、tsconfig.json
でexperimentalDecorators: true
が設定されているかのようにパーサーに動作させることができますが、型を意識したリンティングは行いません。つまり、この場合はparserOptions.project
を指定する必要がなくなり、リンティングプロセスが高速化されます。
extraFileExtensions
デフォルトは
undefined
です。
このオプションを使用すると、TypeScriptプログラムのコンパイルで考慮する必要がある1つ以上の追加ファイル拡張子を指定できます。デフォルトの拡張子は['.js', '.mjs', '.cjs', '.jsx', '.ts', '.mts', '.cts', '.tsx']
です。.
で始まる拡張子に、ファイル拡張子を続けて追加します。例えば、.vue
ファイルの場合は"extraFileExtensions": [".vue"]
を使用します。
jsDocParsingMode
parserOptions.project
が設定されている場合は'all'
、それ以外の場合は'none'
がデフォルトです。
TSがファイルを解析すると、JSDocコメントもASTに解析されます。これにより、lintルールで使用できます。TypeScriptバージョン5.3以上の場合は、このオプションをパフォーマンス最適化として使用できます。
このルールの有効な値は次のとおりです。
'all'
- すべてのJSDocコメントを常に解析します。'none'
- JSDocコメントを一切解析しません。'type-info'
- 型情報を提供するために必要なJSDocコメントのみを解析します。TSは常にTS以外のファイルではJSDocを解析しますが、TSファイルでは決して解析しません。
TSのJSDocタグ表現に依存するeslint-plugin-deprecation
などのlintルールを使用しない場合は、これを'none'
に設定してパーサーのパフォーマンスを向上させることができます。
jsxFragmentName
デフォルトは
null
です。
JSXフラグメント要素(トランスパイル後)に使用される識別子です。null
の場合、トランスパイルは常に構成されたjsxPragma
のメンバーを使用すると想定されます。これはメンバ式ではありません。ルート識別子のみを使用してください(つまり、"h.Fragment"
ではなく"h"
を使用します)。
parserOptions.project
を指定する場合は、コンパイラから自動的に検出されるため、これを設定する必要はありません。
jsxPragma
デフォルトは
'React'
です。
JSX要素の作成に使用される識別子(トランスパイル後)です。React以外のライブラリ(preact
など)を使用している場合は、この値を変更する必要があります。新しいJSX変換を使用している場合は、これをnull
に設定できます。
これはメンバ式ではなく、ルート識別子である必要があります(つまり、"React.createElement"
ではなく"React"
を使用してください)。
parserOptions.project
を指定する場合は、コンパイラから自動的に検出されるため、これを設定する必要はありません。
lib
デフォルト
['es2018']
有効なオプションについては、TypeScriptコンパイラオプションを参照してください。
使用可能なTypeScript lib
を指定します。これは、スコープアナライザーによって、TypeScriptによって公開される型に対してグローバル変数が宣言されていることを確認するために使用されます。
parserOptions.project
を指定する場合は、コンパイラから自動的に検出されるため、これを設定する必要はありません。
programs
デフォルトは
undefined
です。
このオプションを使用すると、ルールに型情報を提供するTypeScript Programオブジェクトのインスタンスをプログラムで提供できます。これは、parserOptions.project
から計算されたプログラムを上書きします。すべてのlint対象ファイルは、提供されたプログラムの一部である必要があります。
resolveModuleNames
関数の書き方については、TypeScript Wikiを参照してください。.
project
デフォルトは
undefined
です。
プロジェクトのTSConfigへのパス。この設定は、型情報が必要なルールを使用するために必要です。
許容される値の型
// find the tsconfig.json nearest to each source file
project: true,
// path
project: './tsconfig.json';
// glob pattern
project: './packages/**/tsconfig.json';
// array of paths and/or glob patterns
project: ['./packages/**/tsconfig.json', './separate-package/tsconfig.json'];
// ways to disable type-aware linting (useful for overrides configs)
project: false;
project: null;
-
true
の場合、各ソースファイルの解析は、そのソースファイルに最も近いtsconfig.json
ファイルを見つけます。- これは、ソースファイルのディレクトリツリーで最も近い
tsconfig.json
をチェックすることによって行われます。
- これは、ソースファイルのディレクトリツリーで最も近い
-
プロジェクト参照を使用する場合、TypeScriptはプロジェクト参照を使用してファイルを解決しません。つまり、参照された各tsconfigを
project
フィールドに個別に、またはglobを使用して追加する必要があります。 -
parserOptions.project
で幅広いglob**
を使用すると、パフォーマンスに影響を与える可能性があることに注意してください。すべてのフォルダを再帰的にチェックする**
を使用するglobの代わりに、一度に1つの*
を使用するパスを優先してください。詳細については、#2611を参照してください。 -
TypeScriptは、同じフォルダにある重複したファイル名のファイル(たとえば、
src/file.ts
とsrc/file.js
)を無視します。TypeScriptは、意図的に1つのファイルを除くすべてのファイルを無視し、優先順位の高い拡張子を持つ1つのファイルのみを保持します(拡張子の優先順位(高い方から低い方)は.ts
、.tsx
、.d.ts
、.js
、.jsx
です)。詳細については、#955を参照してください。
tsconfigRootDir
が設定されていない場合、相対パスは現在の作業ディレクトリを基準に解釈されます。
この設定を指定する場合は、提供されたTSConfigファイルで定義されているプロジェクトに含まれているファイルのみをlintする必要があります。既存の設定にlintしたいすべてのファイルが含まれていない場合は、次のように別のtsconfig.eslint.json
を作成できます。
{
// extend your base config so you don't have to redefine your compilerOptions
"extends": "./tsconfig.json",
"include": [
"src/**/*.ts",
"test/**/*.ts",
"typings/**/*.ts",
// etc
// if you have a mixed JS/TS codebase, don't forget to include your JS files
"src/**/*.js",
],
}
TSConfigファイルの外部にあるファイルをlintできるオプションについては、EXPERIMENTAL_useProjectService
を参照してください。
projectFolderIgnoreList
デフォルト
["**/node_modules/**"]
。
このオプションを使用すると、提供されたproject
のリストに含まれるフォルダを無視できます。globパターンを設定したが、特定のフォルダを確実に無視したい場合に便利です。
project
globから除外するglobの配列を受け入れます。
たとえば、デフォルトでは、./**/tsconfig.json
のようなglobがnode_modules
フォルダ内のtsconfig
と一致しないようにします(一部のnpmパッケージは、公開されたパッケージからソースファイルを除外していません)。
tsconfigRootDir
デフォルトは
undefined
です。
このオプションを使用すると、上記のproject
オプションで指定された相対TSConfigパスのルートディレクトリを提供できます。これにより、ルート以外のディレクトリからESLintを実行しても、TSConfigを見つけることができます。
warnOnUnsupportedTypeScriptVersion
デフォルト
true
。
このオプションを使用すると、明示的にサポートされていないバージョンのTypeScriptを使用した場合にパーサーが出力する警告を有効または無効にできます。警告メッセージは次のようになります。
=============
WARNING: You are currently running a version of TypeScript which is not officially supported by @typescript-eslint/typescript-estree.
You may find that it works just fine, or you may not.
SUPPORTED TYPESCRIPT VERSIONS: >=3.3.1 <5.1.0
YOUR TYPESCRIPT VERSION: 5.1.3
Please only submit bug reports when using the officially supported version.
=============
EXPERIMENTAL_useProjectService
デフォルトは
false
です。
parserOptions.project
の実験的な代替手段です。これは、パーサーに、ルールのための型情報を生成するために、よりシームレスなTypeScript APIを使用するように指示します。これは、各ファイルのTSConfigを自動的に検出し(project: true
のように)、allowJs
コンパイラオプションがないJavaScriptファイルについても型情報を計算できます(project: true
とは異なります)。
- フラット設定
- レガシー設定
export default [
{
languageOptions: {
parserOptions: {
EXPERIMENTAL_useProjectService: true,
},
},
},
];
module.exports = {
parser: '@typescript-eslint/parser',
parserOptions: {
EXPERIMENTAL_useProjectService: true,
},
};
このオプションは、主に2つの利点をもたらします。
- よりシンプルな設定:ほとんどのプロジェクトでは、
project
パスを明示的に設定したり、tsconfig.eslint.json
を作成する必要はありません。 - パフォーマンスの向上:このAPIは、速度のためにTypeScript側で最適化されています。
- このオプションの初期バージョンでは、typescript-eslintモノレポのサブセットのパフォーマンスが11%低下から70%向上する変化が示されました。
このオプションは最終的に型付きlintを有効にする標準的な方法になることを期待しています。これは、TypeScriptプログラムを手動で作成するパーサーを、代わりにVS Codeなどのエディターで使用されているのと同じ「プロジェクトサービス」APIを呼び出すように切り替えます。しかし、非常に新しくテストされていないため、少なくともすべての6.X
バージョンではEXPERIMENTAL_
プレフィックスの下に維持しています。
詳細については、feat(typescript-estree): add EXPERIMENTAL_useProjectService option to use TypeScript project serviceを参照してください。
ユーティリティ
createProgram(configFile, projectDirectory)
これは、parserOptions.programs
機能のユーザーが設定ファイルからTypeScriptプログラムインスタンスを作成するためのユーティリティメソッドとして機能します。
declare function createProgram(
configFile: string,
projectDirectory?: string,
): import('typescript').Program;
使用例
- フラット設定
- レガシー設定
import * as parser from '@typescript-eslint/parser';
export default [
{
parserOptions: {
programs: [parser.createProgram('tsconfig.json')],
},
},
];
const parser = require('@typescript-eslint/parser');
module.exports = {
parserOptions: {
programs: [parser.createProgram('tsconfig.json')],
},
};
withoutProjectParserOptions(parserOptions)
パーサーに型情報を使用してプロジェクトを解析するように促すオプションを削除します。つまり、パーサーを直接呼び出す場合、これは1つのファイルが独立して解析されるようにするために使用でき、はるかに高速になります。
これは、ESLintプラグインコンテキストなど、パーサーを直接呼び出す場合に役立ちます。
declare function withoutProjectParserOptions(
options: TSESTreeOptions,
): TSESTreeOptions;
使用例
const parser = require('@typescript-eslint/parser');
function parse(path, content, context) {
const contextParserOptions = context.languageOptions?.parserOptions ?? {};
const parserOptions =
parser.withoutProjectParserOptions(contextParserOptions);
// Do something with the cleaned-up options eventually, such as invoking the parser
parser.parseForESLint(content, parserOptions);
}