require-array-sort-compare
Array#sort
とArray#toSorted
の呼び出しで常に`compareFunction`を提供することを要求します。
💭
このルールには 型情報 が必要です。
比較関数を指定せずに呼び出された場合、Array#sort()
とArray#toSorted()
は、定義されていない配列要素以外のすべての要素を文字列に変換し、その文字列をUTF-16コードユニットに基づいて比較します[ECMA仕様]。
その結果、要素の型に関係なく、アルファベット順にソートされます。たとえば、数値をソートする場合、「10が2より前」という順序になります。
[1, 2, 3, 10, 20, 30].sort(); //→ [1, 10, 2, 20, 3, 30]
このルールは、比較引数を指定せずにソートメソッドを呼び出した場合に報告します。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/require-array-sort-compare": "error"
}
};
このルールをPlaygroundでお試しください ↗
例
このルールは、ネイティブのソートメソッドの呼び出しすべてで`compareFunction`が提供されることを保証することを目的としており、ユーザー定義メソッドへの呼び出しは無視します。
- ❌ 正しくない
- ✅ 正しい
const array: any[];
const stringArray: string[];
array.sort();
// String arrays should be sorted using `String#localeCompare`.
stringArray.sort();
Playgroundで開くconst array: any[];
const userDefinedType: { sort(): void };
array.sort((a, b) => a - b);
array.sort((a, b) => a.localeCompare(b));
userDefinedType.sort();
Playgroundで開くオプション
このルールは、以下のオプションを受け入れます。
type Options = [
{
/** Whether to ignore arrays in which all elements are strings. */
ignoreStringArrays?: boolean;
},
];
const defaultOptions: Options = [{ ignoreStringArrays: true }];
ignoreStringArrays
`{ ignoreStringArrays: true }` を使用したこのルールのコード例
- ❌ 正しくない
- ✅ 正しい
const one = 1;
const two = 2;
const three = 3;
[one, two, three].sort();
Playgroundで開くconst one = '1';
const two = '2';
const three = '3';
[one, two, three].sort();
Playgroundで開く使用しない場合
意図的に配列を常に文字列のような方法でソートする場合は、このルールを安全にオフにすることができます。
型チェックされたlintルールは従来のlintルールよりも強力ですが、型チェックされたlintの構成も必要です。型チェックされたルールを有効にした後にパフォーマンスの低下が発生する場合は、パフォーマンスに関するトラブルシューティングを参照してください。