メインコンテンツへスキップ

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で開く

このルールの理由は、プログラマが、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の問題を参照してください。

.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/use-unknown-in-catch-callback-variable": "error"
}
};

Playgroundでこのルールを試す ↗

オプション

このルールは設定できません。

使用しない場合

コードベースでまだ`useUnknownInCatchVariables`を有効にできない場合は、このルールを有効にするのも同様に困難な可能性があります。

明示的な型注釈なしで`catch()`コールバックが`unknown`型を使用するようにグローバル型宣言を変更した場合は、このルールは必要ありません。


型チェックされたlintルールは従来のlintルールよりも強力ですが、型チェックされたlintingの設定も必要です。型チェックされたルールを有効にした後にパフォーマンスの低下が発生した場合は、パフォーマンスのトラブルシューティングを参照してください。

リソース