use-unknown-in-catch-callback-variable
強制在
.catch()
回呼中將輸入類型化引數為unknown
。
延伸 「plugin:@typescript-eslint/strict-type-checked"
在 ESLint 設定 中啟用這項規則。
這條規則回報的部分問題能由 --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.reject(new Error('I will reject!')).catch((err: unknown) => {
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。
module.exports = {
"rules": {
"@typescript-eslint/use-unknown-in-catch-callback-variable": "error"
}
};
在遊樂場中嘗試此規則 ↗
選項
這項規則不可設定。
不用於什麼情況
如果你的程式碼庫還無法啟用 useUnknownInCatchVariables
,那麼啟用此規則的難度也可能類似。
如果你修改了全域類型宣告,以便讓 catch()
回呼在沒有明確類型註解的情況下使用 unknown
類型,則不需要此規則。
已類型檢查的 lint 規則比傳統的 lint 規則更強大,但前提是需要設定已類型檢查的 lintinglint。若在啟用已類型檢查的規則後發現效能下降,請參閱效能問題排除一文。