require-array-sort-compare
要求
Array#sort
和Array#toSorted
呼叫總是提供compareFunction
。
💭
此規則需要 類型資訊 來執行。
當在沒有比較函式的狀態下呼叫時,Array#sort()
和 Array#toSorted()
會將所有非 undefined 的陣列元素轉換成字串,然後根據它们的 UTF-16 代碼單位來比較這些字串 [ECMA 規格]
結果是元素會按字母順序排序,而不論它們的類型。例如,當對數字排序時,這會導致 "10 在 2 之前" 的順序
[1, 2, 3, 10, 20, 30].sort(); //→ [1, 10, 2, 20, 3, 30]
此規則報告沒有提供 compare
參數的任何排序方法呼叫。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/require-array-sort-compare": "error"
}
};
在測試區中嘗試此規則 ↗
範例
此規則旨在確保所有對原生排序方法的呼叫都提供 compareFunction
,同時無視對使用者定義方法的呼叫。
- ❌ 不正確
- ✅ 正確
const array: any[];
const stringArray: string[];
array.sort();
// String arrays should be sorted using `String#localeCompare`.
stringArray.sort();
在測試區中開啟const array: any[];
const userDefinedType: { sort(): void };
array.sort((a, b) => a - b);
array.sort((a, b) => a.localeCompare(b));
userDefinedType.sort();
在測試區中開啟選項
此規則接受下列選項
type Options = [
{
/** Whether to ignore arrays in which all elements are strings. */
ignoreStringArrays?: boolean;
},
];
const defaultOptions: Options = [{ ignoreStringArrays: true }];
ignoreStringArrays
此規則搭配 { ignoreStringArrays: true }
的程式碼範例
- ❌ 不正確
- ✅ 正確
何時不該使用
如果您強烈希望您的陣列始終以類似字串的方式排序,可以安全地關閉此規則。
類型檢查型 linter 規則比傳統 linter 規則功能更強大,但也需要設定 類型檢查型 linting。如果您在啟用類型檢查型規則後遇到效能劣化,請參閱 效能疑難排解。