no-explicit-any
不允許
any
類型。
✅
延伸 "plugin:@typescript-eslint/建議"
在 ESLint 設定 中啟用此規則。
🔧
此規則回報的某些問題可透過 --fix
ESLint 命令列選項自動修正.
💡
此規則回報的某些問題可透過編輯器 建議手動修正.
TypeScript 中的 any
類型是類型系統中的危險「跳脫節點」。使用 any
會停用許多類型檢查規則,通常只在最後手段或原型化程式碼時才會使用。此規則會在明確使用 any
關鍵字作為類型註解時回報。
any
的替代方案包括
- 如果知道了類型,請在
interface
或type
中描述它 - 如果不知道類型,請使用較為安全的
unknown
類型
TypeScript 的
--noImplicitAny
編譯器選項可防止隱含的any
,但並未像此規則一樣防止明確使用any
。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/no-explicit-any": "error"
}
};
在遊樂場中嘗試此規則↗
範例
- ❌ 不正確
- ✅ 正確
const age: any = 'seventeen';
在 Playground 中開啟const ages: any[] = ['seventeen'];
在 Playground 中開啟const ages: Array<any> = ['seventeen'];
在 Playground 中開啟function greet(): any {}
在 Playground 中開啟function greet(): any[] {}
在 Playground 中開啟function greet(): Array<any> {}
在 Playground 中開啟function greet(): Array<Array<any>> {}
在 Playground 中開啟function greet(param: Array<any>): string {}
在 Playground 中開啟function greet(param: Array<any>): Array<any> {}
在 Playground 中開啟const age: number = 17;
在 Playground 中開啟const ages: number[] = [17];
在 Playground 中開啟const ages: Array<number> = [17];
在 Playground 中開啟function greet(): string {}
在 Playground 中開啟function greet(): string[] {}
在 Playground 中開啟function greet(): Array<string> {}
在 Playground 中開啟function greet(): Array<Array<string>> {}
在 Playground 中開啟function greet(param: Array<string>): string {}
在 Playground 中開啟function greet(param: Array<string>): Array<string> {}
在 Playground 中開啟選項
此規則接受以下選項
type Options = [
{
/** Whether to enable auto-fixing in which the `any` type is converted to the `unknown` type. */
fixToUnknown?: boolean;
/** Whether to ignore rest parameter arrays. */
ignoreRestArgs?: boolean;
},
];
const defaultOptions: Options = [
{ fixToUnknown: false, ignoreRestArgs: false },
];
fixToUnknown
預設情況下,此規則不會提供自動 ESLint 修正:僅提供選擇性建議。將型別切換到 unknown
較安全,但可能會導致其他型別錯誤。
啟用 { "fixToUnknown": true }
給予該規則一個自動修正器,以 : unknown
取代 : any
。
ignoreRestArgs
一個布林值,用於指定是否將陣列從 rest 算子視為沒問題。預設為 false
。
當 {ignoreRestArgs: false}
時,下列範例不正確,但當 {ignoreRestArgs: true}
時,則正確。
function foo1(...args: any[]): void {}
function foo2(...args: readonly any[]): void {}
function foo3(...args: Array<any>): void {}
function foo4(...args: ReadonlyArray<any>): void {}
declare function bar(...args: any[]): void;
const baz = (...args: any[]) => {};
const qux = function (...args: any[]) {};
type Quux = (...args: any[]) => void;
type Quuz = new (...args: any[]) => void;
interface Grault {
(...args: any[]): void;
}
interface Corge {
new (...args: any[]): void;
}
interface Garply {
f(...args: any[]): void;
}
在 Playground 中開啟什麼時候不使用
any
永遠是一個危險的逃生艙口。只要有可能,總是最好避免它。TypeScript 的 unknown
幾乎總是優於 any
。
但是,有時有必要使用 any
。最常見的情況是
- 如果專案尚未完全轉移到 TypeScript,則可以在尚未得知或表示型別的地方暫時使用
any
- 如果外部套件尚未有型別,而您希望在為其加入
.d.ts
之前使用any
- 您正在使用 TypeScript 型別系統中尚無法表示的特別複雜或細微的程式碼
您可以考慮使用 ESLint 禁用評論,針對特定情況使用,而不是完全停用此規則。
關聯
進一步閱讀
- TypeScript 的
any
型別 - TypeScript 的
unknown
型別 - TypeScript 的
any
型別文件 - TypeScript
unknown
型別發行註解