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

prefer-reduce-type-parameter

`Array#reduce` を呼び出す際に、キャストではなく型パラメータを使用することを強制します。

🔒

拡張 "plugin:@typescript-eslint/"strict-type-checked" ESLint 設定 で有効にすると、このルールが有効になります。

🔧

このルールによって報告される問題の一部は、 `--fix` ESLint コマンドラインオプション.

によって自動的に修正できます。

💭 このルールを実行するには 型情報

が必要です。

  • `Array#reduce` を、配列やオブジェクトなどのジェネリック型を初期値として呼び出すことはよくあります。これらの値は空であるため、その型は使用できません。
  • `[]` は `never[]` 型であり、`never` 型のアイテムは存在しないため、アイテムをプッシュできません。

`{}` は `{}` 型であり、インデックスシグネチャを持たないため、プロパティを追加できません。

この問題の一般的な解決策は、初期値に `as` アサーションを使用することです。これは機能しますが、型アサーションは基底の型に微妙な影響を与え、バグが入り込む可能性があるため、最適な解決策ではありません。

より良い解決策は、`Array#reduce` にジェネリック型引数として型を明示的に渡すことです。これにより、TypeScript は型を推論する必要がなくなり、キャストに伴う一般的な落とし穴を回避できます。

このルールは `Array#reduce` の呼び出しを探し、初期値が渡されてアサートされている場合は報告します。代わりに、アサートされた型をジェネリック型引数として `Array#reduce` に渡すことを提案します。
module.exports = {
"rules": {
"@typescript-eslint/prefer-reduce-type-parameter": "error"
}
};

.eslintrc.cjs

プレイグラウンドでこのルールを試す ↗

[1, 2, 3].reduce((arr, num) => arr.concat(num * 2), [] as number[]);

['a', 'b'].reduce(
(accum, name) => ({
...accum,
[name]: true,
}),
{} as Record<string, boolean>,
);
✅ 正しい

プレイグラウンドで開く

オプション

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

使用しない場合


`.reduce` を使用してオブジェクトを作成する場合、このルールを回避するのが難しい場合があります。詳細は [prefer-reduce-type-parameter] 修正できないレポート #3440 を参照してください。このルールを完全に無効にする代わりに、特定の状況で ESLint 無効化コメント を使用することを検討してください。

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