跳至主要內容

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 中開啟

在某些情況下,規則允許將 `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。如果在啟用類型檢查規則後遇到效能降低的問題,請參閱 效能疑難排解

資源