跳至主要內容

use-unknown-in-catch-callback-variable

強制在 .catch() 回呼中將輸入類型化引數為 unknown

🔧

這條規則回報的部分問題能由 --fix ESLint 命令列選項.

建議

💭 這條規則需要 類型資訊

這條規則強制您總是對 Promise.prototype.catch() 回呼的參數使用 unknown 類型。

Promise.reject(new Error('I will reject!')).catch(err => {
console.log(err);
});

Promise.reject(new Error('I will reject!')).catch((err: any) => {
console.log(err);
});

Promise.reject(new Error('I will reject!')).catch((err: Error) => {
console.log(err);
});
在遊戲場中開啟

這條規則的原因是為了讓程式員能夠對 Promise 錯誤處理施加約束,與 TypeScript 提供給一般例外處理的情況類比。

對於普通例外,預設情況下 TypeScript 將 catch 變數視為 any。不過,unknown 會是一個更精確的類型,所以 TypeScript 引入了 useUnknownInCatchVariables 編譯器選項,以將 catch 變數處理成 unknown

try {
throw x;
} catch (err) {
// err has type 'any' with useUnknownInCatchVariables: false
// err has type 'unknown' with useUnknownInCatchVariables: true
}

try-catch 方塊的 Promise 類比 Promise.prototype.catch() 不受 useUnknownInCatchVariables 編譯器選項的影響,其「catch變數」永遠會有 any 類型。

Promise.reject(x).catch(err => {
// err has type 'any' regardless of `useUnknownInCatchVariables`
});

但你仍可以提供明確的類型註解,讓你達成與 useUnknownInCatchVariables 選項對同步 catch 變數所做的相同效果。

Promise.reject(x).catch((err: unknown) => {
// err has type 'unknown'
});
資訊

其實有一個方法可以在呼叫位址無明確類型註解的情況下,讓 catch() 回呼變數使用 unknown 類型,但它的缺點是會需要覆寫全域類型宣告。例如函式庫 better-TypeScript-lib 會針對你的專案在全域設定這個(請參閱 better-TypeScript-lib 原始碼中相關行 以獲得如何這麽做的詳細說明)。

如需進一步的相關閱讀,你可能也想深入探討 這項規則提案中的討論 以及 此 TypeScript 問題中針對將 catch 回呼變數的類型設定為 unknown

.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/use-unknown-in-catch-callback-variable": "error"
}
};

在遊樂場中嘗試此規則 ↗

選項

這項規則不可設定。

不用於什麼情況

如果你的程式碼庫還無法啟用 useUnknownInCatchVariables,那麼啟用此規則的難度也可能類似。

如果你修改了全域類型宣告,以便讓 catch() 回呼在沒有明確類型註解的情況下使用 unknown 類型,則不需要此規則。


已類型檢查的 lint 規則比傳統的 lint 規則更強大,但前提是需要設定已類型檢查的 lintinglint。若在啟用已類型檢查的規則後發現效能下降,請參閱效能問題排除一文。

資源