跳到主要內容

no-explicit-any

不允許 any 類型。

延伸 "plugin:@typescript-eslint/建議" ESLint 設定 中啟用此規則。

🔧

此規則回報的某些問題可透過 --fix ESLint 命令列選項自動修正.

💡

此規則回報的某些問題可透過編輯器 建議手動修正.

TypeScript 中的 any 類型是類型系統中的危險「跳脫節點」。使用 any 會停用許多類型檢查規則,通常只在最後手段或原型化程式碼時才會使用。此規則會在明確使用 any 關鍵字作為類型註解時回報。

any 的替代方案包括

  • 如果知道了類型,請在 interfacetype 中描述它
  • 如果不知道類型,請使用較為安全的 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 中開啟

選項

此規則接受以下選項

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 禁用評論,針對特定情況使用,而不是完全停用此規則。

進一步閱讀

資源