no-unsafe-assignment
禁止將類型為 `any` 的值賦值給變數和屬性。
💭
此規則需要 類型資訊 才能執行。
TypeScript 中的 `any` 類型是一種危險的「逃生艙口」,可以繞過類型系統。使用 `any` 會停用許多類型檢查規則,並且通常最好僅在不得已或原型化程式碼時才使用。
儘管您已盡力避免,但 `any` 類型有時仍會洩漏到您的程式碼庫中。將 `any` 類型的值賦值給變數可能難以察覺,尤其是當它從外部程式庫洩漏進來時。
此規則禁止將 `any` 賦值給變數,以及將 `any[]` 賦值給陣列解構。
此規則還會比較泛型類型引數類型,以確保您不會在泛型位置將不安全的 `any` 傳遞給預期特定類型的接收者。例如,如果您將 `Set<any>` 賦值給宣告為 `Set<string>` 的變數,則會發生錯誤。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/no-unsafe-assignment": "error"
}
};
在 Playground 中試用此規則 ↗
範例
- ❌ 不正確
- ✅ 正確
const x = 1 as any,
y = 1 as any;
const [x] = 1 as any;
const [x] = [] as any[];
const [x] = [1 as any];
[x] = [1] as [any];
function foo(a = 1 as any) {}
class Foo {
constructor(private a = 1 as any) {}
}
class Foo {
private a = 1 as any;
}
// generic position examples
const x: Set<string> = new Set<any>();
const x: Map<string, string> = new Map<string, any>();
const x: Set<string[]> = new Set<any[]>();
const x: Set<Set<Set<string>>> = new Set<Set<Set<any>>>();
在 Playground 中開啟const x = 1,
y = 1;
const [x] = [1];
[x] = [1] as [number];
function foo(a = 1) {}
class Foo {
constructor(private a = 1) {}
}
class Foo {
private a = 1;
}
// generic position examples
const x: Set<string> = new Set<string>();
const x: Map<string, string> = new Map<string, string>();
const x: Set<string[]> = new Set<string[]>();
const x: Set<Set<Set<string>>> = new Set<Set<Set<string>>>();
在 Playground 中開啟在某些情況下,規則允許將 `any` 賦值給 `unknown`。
允許將 `any` 賦值給 `unknown` 的範例
const x: unknown = y as any;
const x: unknown[] = y as any[];
const x: Set<unknown> = y as Set<any>;
在 Playground 中開啟選項
此規則不可設定。
何時不應使用
如果您的程式碼庫中有許多現有的 `any` 或不安全的程式碼區域,則可能難以啟用此規則。在專案的不安全區域中提高類型安全性的同時,您可以考慮跳過 `no-unsafe-*` 規則。您不妨考慮針對這些特定情況使用 ESLint 停用註解,而不是完全停用此規則。
相關規則
類型檢查 linting 規則比傳統的 linting 規則更強大,但也需要設定 類型檢查 linting。如果在啟用類型檢查規則後遇到效能降低的問題,請參閱 效能疑難排解。