標題:“讓我們面對現實:是時候在 TypeScript 中拋棄any
而使用unknown
”
已發布:真實
描述:“我們都曾嘗試過any
快速解決方案,但代價高昂。探索為什麼unknown
是更安全、更明智的選擇,可以讓你免於未來的麻煩。”
標籤:
打字稿
JavaScript
程式碼審查
我們都曾在拉取請求中見過這種情況。開發人員遇到了棘手的資料類型問題,為了讓事情正常運轉,他們使用了最簡單的工具: any
。它完成了工作,並讓編譯器沉默,但卻帶來了隱性成本。
我們的團隊設置了一個 Husky 預先提交鉤子來標記any
,這是一個很好的開始。但我們都知道,在緊急情況下, --no-verify
標誌很容易被忽略。這使得程式碼審查成為我們最重要的防線。當你發現any
漏網時,正是提倡使用更安全、更聰明的替代方案的絕佳機會: unknown
。
any
的危險:對編譯器的「相信我」承諾🙈坦白說:使用any
就像告訴 TypeScript 編譯器別管它。當你將變數類型設為any
,實際上是在說:“停用所有類型檢查。我知道自己在做什麼。”
這意味著您可以使用該變數做任何事情,並且 TypeScript 不會阻止您,直到它在執行時爆炸。
這是一個典型的例子:
let myData: any;
myData = "This is a string";
// TypeScript has no problem with this line...
// but it will crash your app!
console.log(myData.toFixed(2));
// 😱 Uncaught TypeError: myData.toFixed is not a function
// The compiler is also perfectly happy with these obvious errors:
myData.someMethodThatDoesNotExist();
const result = myData * 10;
你使用的每一個any
對我們賴以生存的 TypeScript 的型別安全造成漏洞。它會把潛在的編譯時捕獲變成令人沮喪的執行時錯誤,並使重構變成一場危險的猜謎遊戲。
unknown
救援! 🦸這時unknown
就派上用場了。就像any
一樣,你可以將任何值(字串、數字、物件)賦給類型為unknown
變數。
那麼這有什麼大不了的?關鍵的差異在於, unknown
不允許你對這個值做任何操作,除非你先證明它是什麼。你必須先處理不確定性,然後才能使用它。
把unknown
變數想像成一個上鎖的盒子。你知道裡面有東西,但你必須先檢查它是什麼,然後才能安全地使用它。
讓我們用unknown
來修復前面的例子:
let myData: unknown;
myData = "This is a string";
// The compiler immediately stops you. This is a good thing!
// ❌ Error: Object is of type 'unknown'.
console.log(myData.toFixed(2));
// Here's how you work with it safely:
if (typeof myData === 'number') {
// OK, inside this block, TypeScript now knows myData is a number.
console.log(myData.toFixed(2));
} else if (typeof myData === 'string') {
// And in here, it knows it's a string.
console.log(myData.toUpperCase());
}
透過切換到unknown
,您可以編寫更具防禦性、更強壯的程式碼。它允許您使用typeof
或instanceof
等類型保護明確處理不同的情況,從而使應用程式更加穩定。
在程式碼審查過程中發現 any any
是一個很好的學習時機。以下是如何建設性地處理它:
理解「為什麼」:開發人員可能只是想快速解決打字問題。無需批評。
解釋風險:簡要提及any
繞過類型安全性並可以隱藏僅在執行時才會顯示的錯誤。
提供解決方案:建議將any
替換為unknown
。然後,指導他們新增必要的類型檢查(例如, if
語句區塊)以安全地存取變數。這不僅解決了眼前的風險,也使程式碼的意圖對每個人都更加清晰。
雖然any
是一種誘人的捷徑,但它破壞了我們使用 TypeScript 的初衷。 unknown為unknown
提供了相同的靈活性來接受任何類型的值,但不會犧牲類型安全性。
透過鼓勵在程式碼審查中使用unknown
,我們正在培養編寫更謹慎、更可預測、更健壯程式碼的習慣。它迫使我們直面不確定性,從而減少 bug,打造更健康的程式碼庫。所以,下次你想使用any
時,請停下來,改用unknown
。未來的你——以及你的隊友——都會感謝你的。
原文出處:https://dev.to/trivedivatsal/lets-be-real-its-time-to-ditch-any-for-unknown-in-typescript-2cn4