今天要來講講型別斷言,當TypeScript(TS)無法確定某個值的具體型別,而開發者能夠確定它的型別時,可以透過型別斷言告訴TS這個值的型別。
型別斷言有一點需要注意:型別斷言只是「告知」TS值的型別,不會造成型別轉換,也不會改變 JavaScript執行時的資料。
asas是目前型別斷言最常見的主流寫法,具體範例如下:
//假設我們有一個unknown型別
let a: unknown = "apple";
//接著我們要求它的字串長度
console.log(a.length); //此時unknown會因為無法確定型別進而導致TS報錯
//因此,除了使用typeof進行型別縮小外,我們也可以透過型別斷言告訴TS,這裡的a可以視為字串:
console.log((a as string).length); //輸出:5
as的用法很簡單,使用「值 as 型別」就能告訴TS,在這個地方把這個值視為指定的型別,這樣我們就能使用該型別提供的屬性或方法。
<型別>語法:<型別>變數<型別>值也是 TypeScript 的型別斷言寫法,不過在使用JSX時會與JSX語法產生衝突,因此現在通常更推薦使用as的寫法。
//<型別>範例:
let b: unknown = "Gurifisu";
console.log((<string>b).length);
unknown型別就跟之前提到的一樣,unknown需要確定是什麼型別才能夠執行方法,使用型別斷言就能解決這個問題,之前在語法上也用unknown舉例過了,這邊就不再特別舉例了。
當我們從DOM中取得元素時,TypeScript有時無法確定這個元素的具體型別,因此在存取特定屬性時可能會出現型別錯誤。
//實際範例:
const myInput = document.getElementById('user-email') as HTMLInputElement;
console.log(myInput.value);
//getElementById()回傳的型別是 HTMLElement | null
//但我們知道這個id對應的是<input>,因此可以透過型別斷言告訴TS把它視為 HTMLInputElement。
如果把兩個毫無關聯的變數進行型別斷言,TS會阻止你做蠢事
let x: string = "000";
let y = x as number; //TS的型別斷言有相容性限制,某些型別不能直接進行斷言。
console.log(y); // "000"
console.log(typeof y); // "string"
如果真的要把字串轉成數字,應該使用Number()、parseInt()等方式進行實際的資料轉換,而不是使用型別斷言。雙重斷言的用途並不是進行型別轉換,而是當TypeScript的型別相容性檢查阻止直接斷言時,先透過unknown 或 any再斷言成目標型別。
let x: string = "000";
let y = (x as unknown) as number;
這邊還是提醒一下,雖然看上去雙重斷言很好用,但跟any一樣還是少用為好,雙重斷言如果判斷錯誤,就可能在執行時發生問題。
今天簡單介紹了型別斷言是什麼?還有在什麼場合能夠使用?結合上一篇的unknown型別,希望大家能夠快速上手型別斷言的應用!