今天要來介紹TypeScript(TS)的特殊型別~包含之前幾篇短暫提到的void和never。
今天要來介紹的型別有:
any因為 any 會讓TS暫時放棄對這個值的型別檢查,因此它可以被賦予不同型別的值。像是前面提到的函式、物件也能夠被any賦值。any的特性讓TS在型別檢查時,any的特性讓TS在型別檢查時,會跳過與這個值相關的型別檢查,因此很多原本應該被發現的型別錯誤也不會被TS提醒。
//any範例:
let a: any = 0; //此時變數a為number
a = "banana"; //因為型別是any,即便重新賦值變成string型別,TS也不會報錯喔!
但老實說,你都特地學TypeScript了,一大特色的型別檢查讓我們在debug的時候更有效率,現在出現一個無視型別檢查,幾乎等同於外掛,繞著檢查走的型別是很方便沒錯,但這不就失去型別檢查的意義了嗎?我是建議any能少用就少用,不然程式哪裡寫錯,還要自己一行一行重新檢查,也太麻煩了。
既然都說any要少用了,那甚麼時候真的會用到它呢?
通常是在需要與舊有 JavaScript 程式碼整合,或某些第三方套件缺少型別資訊時,才可能暫
時使用 `any`。
unknownunknown是個和any很相似的型別,一樣可以兼容很多型別,差別在於any 會讓TS放棄型別檢查,但 unknown 在使用它的方法或屬性之前,必須先確認它的型別。
//unknown範例:(錯誤版本)
let b: unknown = "apple";
b.toUpperCase(); //因為無法確認型別,TS會直接報錯
//unknown範例:(正確版本)
//如何讓unknown意識到型別是正確的呢?
//使用typeof,推導出b的型別目前是字串
if (typeof b === "string") {
console.log(b.toUpperCase()); //雖然有點麻煩,但這樣就不會報錯了!
}
雖然在編撰上,unknown比any更麻煩,但更為嚴謹,也是大家比較推薦的寫法。至於typeof是什麼?我們日後也會介紹到喔!
void在前兩天介紹函式時,我有稍微提及到的void,這邊就來重新正式介紹一下它吧!void 常用在函式的回傳型別上,表示這個函式的回傳值不會被拿來使用。
//void範例:
function c(): void {
console.log("Good Morning!");
} //void常用在函式的回傳型別上,表示這個函式的回傳值不會被拿來使用。
never之前在介紹交叉型別時,也有小小提到never型別,在我沒有放棄斷更的前提下,它終於成為今天的壓軸主角!嗚呼!never在英文裡就有「 決不、從來沒有」的意思,是語氣很強烈的否定詞。在TS裡,never表示不會出現的值。用在函式上時,代表這個函式永遠不會正常結束,因此不會產生可以正常取得的回傳值。
//never範例:
//情境1:拋出錯誤,強行中斷程式
function d(msg: string): never {
throw new Error(msg);
} //執行到 `throw` 時,函式會立即停止正常執行,並將錯誤往外拋出
//情境2:無窮迴圈
function e(): never {
while (true) {
console.log("執行到天荒地老");
}
} //因為函式進入了無限迴圈,不會正常結束,永遠被困在這個迴圈中,也不會回傳值
今天將4個特殊型別都介紹完了,可能有些人還搞不懂any跟unknown的差別、void跟never對於回傳值的差別,因此這邊做了統整給大家參考:
any |
unknown |
void |
never |
|
|---|---|---|---|---|
| 概念 | 會讓TS跳過相關的型別檢查 | 任何型別的值都可以賦值給它,但使用方法或屬性前要先確認型別 | 函式通常會正常結束,回傳值不會被使用 | 函式不會正常結束,因此不會產生可正常取得的回傳值 |
| 型別檢查? | TypeScript會跳過相關型別檢查 | 使用前需要,事前檢查不易出錯,稍微麻煩點 | / | / |
| 常見用途 | 與舊有JavaScript程式碼整合、第三方套件缺少型別資訊時暫時使用 | 不確定型別的時候,比any安全,建議用這個 |
函式沒有回傳值 | 不斷拋出錯誤例外、無限迴圈時使用 |
以上就是今天的內容啦!各位明天見囉!大家拜拜~~~