use-unknown-in-catch-callback-variable
`.catch()`コールバック内の型付き引数を`unknown`として強制します。
拡張 "plugin:@typescript-eslint/"strict-type-checked"
を ESLint設定 で有効にすると、このルールが有効になります。
このルールによって報告される問題の一部は、 `--fix` ESLintコマンドラインオプション.
このルールを実行するには、 型情報 が必要です。
このルールは、`Promise.prototype.catch()`コールバックのパラメータに常に`unknown`型を使用することを強制します。
- ❌ 正しくない
- ✅ 正しい
Promise.reject(new Error('I will reject!')).catch(err => {
console.log(err);
});
Promise.reject(new Error('I will reject!')).catch((err: any) => {
console.log(err);
});
Promise.reject(new Error('I will reject!')).catch((err: Error) => {
console.log(err);
});
Playgroundで開くPromise.reject(new Error('I will reject!')).catch((err: unknown) => {
console.log(err);
});
Playgroundで開くこのルールの理由は、プログラマが、TypeScriptが通常の例外処理に提供するものと同様に、`Promise`エラー処理に制約を課せるようにすることです。
通常の例外の場合、TypeScriptはデフォルトで`catch`変数を`any`型として扱います。しかし、`unknown`型の方が正確な型であるため、TypeScriptは`useUnknownInCatchVariables`コンパイラオプションを導入し、`catch`変数を`unknown`型として扱うようになりました。
try {
throw x;
} catch (err) {
// err has type 'any' with useUnknownInCatchVariables: false
// err has type 'unknown' with useUnknownInCatchVariables: true
}
`try-catch`ブロックのPromiseアナログである`Promise.prototype.catch()`は、`useUnknownInCatchVariables`コンパイラオプションの影響を受けず、「`catch`変数」は常に`any`型になります。
Promise.reject(x).catch(err => {
// err has type 'any' regardless of `useUnknownInCatchVariables`
});
ただし、明示的な型注釈を付けることで、同期的な`catch`変数に対して`useUnknownInCatchVariables`オプションと同じ効果を得ることができます。
Promise.reject(x).catch((err: unknown) => {
// err has type 'unknown'
});
実際には、コールサイトで明示的な型注釈を使用せずに、`catch()`コールバック変数が`unknown`型を使用する方法がありますが、グローバル型宣言を上書きする必要があるという欠点があります。例えば、better-TypeScript-libライブラリは、プロジェクト全体でこれをグローバルに設定します(better-TypeScript-libソースコードの関連行を参照して詳細を確認してください)。
これに関するさらに詳しい情報については、このルールの提案に関する議論とcatchコールバック変数をunknown型として型付けする際のTypeScriptの問題を参照してください。
module.exports = {
"rules": {
"@typescript-eslint/use-unknown-in-catch-callback-variable": "error"
}
};
Playgroundでこのルールを試す ↗
オプション
このルールは設定できません。
使用しない場合
コードベースでまだ`useUnknownInCatchVariables`を有効にできない場合は、このルールを有効にするのも同様に困難な可能性があります。
明示的な型注釈なしで`catch()`コールバックが`unknown`型を使用するようにグローバル型宣言を変更した場合は、このルールは必要ありません。
型チェックされたlintルールは従来のlintルールよりも強力ですが、型チェックされたlintingの設定も必要です。型チェックされたルールを有効にした後にパフォーマンスの低下が発生した場合は、パフォーマンスのトラブルシューティングを参照してください。