特殊類(lèi)型
類(lèi)型:any
any
是一種禁用類(lèi)型檢查并實(shí)際上允許使用所有類(lèi)型的類(lèi)型。
下面的例子沒(méi)有使用 any
,將會(huì)拋出一個(gè)錯(cuò)誤:
沒(méi)有 any 的例子
let u = true; u = "string"; // 錯(cuò)誤:類(lèi)型 'string' 不能分配給類(lèi)型 'boolean'。 Math.round(u); // 錯(cuò)誤:類(lèi)型為 'boolean' 的參數(shù)不能分配給類(lèi)型為 'number' 的參數(shù)。
將特殊類(lèi)型 any
設(shè)置為 true
會(huì)禁用類(lèi)型檢查:
帶有 any 的例子
let v: any = true; v = "string"; // 沒(méi)有錯(cuò)誤,因?yàn)樗梢允?“any” 類(lèi)型 Math.round(v); // 沒(méi)有錯(cuò)誤,因?yàn)樗梢允?“any” 類(lèi)型
由于 any
禁用了類(lèi)型檢查,因此它可以作為一種有用的方法來(lái)解決錯(cuò)誤,但 TypeScript 將無(wú)法提供類(lèi)型安全性,而且依賴類(lèi)型數(shù)據(jù)的工具(如自動(dòng)完成)將無(wú)法工作。請(qǐng)記住,應(yīng)該不惜 “任何” 代價(jià)避免使用它......
類(lèi)型:unknown
unknown
是一種與 any 類(lèi)似但更安全的替代方案。
TypeScript 將阻止使用 unknown
類(lèi)型,如下面的例子所示:
let w: unknown = 1; w = "string"; // no error w = { runANonExistentMethod: () => { console.log("I think therefore I am"); } } as { runANonExistentMethod: () => void} // 當(dāng)我們不知道類(lèi)型時(shí),如何避免下面注釋掉的代碼出現(xiàn)錯(cuò)誤? // w.runANonExistentMethod(); // Error: Object is of type 'unknown'. if(typeof w === 'object' && w !== null) { (w as { runANonExistentMethod: Function }).runANonExistentMethod(); } // 盡管我們必須多次轉(zhuǎn)換,但我們可以在 if 中進(jìn)行檢查以確保我們的類(lèi)型安全,并進(jìn)行更安全的轉(zhuǎn)換
將上面的例子與之前的帶有 any
的例子進(jìn)行比較。
當(dāng)您不知道要鍵入的數(shù)據(jù)類(lèi)型時(shí),最好使用 unknown
。要稍后添加類(lèi)型,您需要進(jìn)行類(lèi)型轉(zhuǎn)換。
類(lèi)型轉(zhuǎn)換是當(dāng)我們使用 “as” 關(guān)鍵字來(lái)說(shuō)屬性或變量是屬于轉(zhuǎn)換后的類(lèi)型時(shí)。
類(lèi)型:never
never
在定義時(shí)實(shí)際上會(huì)拋出一個(gè)錯(cuò)誤。
let x: never = true; // 錯(cuò)誤:類(lèi)型 'boolean' 不能分配給類(lèi)型 'never'。
never
很少使用,尤其是單獨(dú)使用,其主要用途是在高級(jí)泛型中。
類(lèi)型:undefined 和 null
undefined
和 null
是分別引用 JavaScript 原語(yǔ) undefined
和 null
的類(lèi)型。
let y: undefined = undefined; let z: null = null;
除非在 tsconfig.json 文件中啟用了 strictNullChecks
,否則這些類(lèi)型沒(méi)有多大用處。