[Day07] - 認識來自TypeScript的新朋友 - 特殊型別
認識來自TypeScript的新朋友
有型別自TypeScript來不亦悅乎!───────────────────── By Opshell
目標:認識來自TypeScript的新朋友
型別總覽
1. 我們先來複習複習JS的型別:
- 原始資料型別
- boolean 布林值
- number 數值
- string 字串
- null 查找不到物件
- undefined 未定義
- symbol(於 ES6 新定義)
- 物件型別
- object 物件
- array 陣列
- function 函式
2. 認識一點TS裡的新朋友
- 特殊型別
- void (空值)
- unknown (不曉得)
- any (任意型別) (全世界都是我的 的可怕型別)
- never (全世界都不是我的 的型別)
- 原始資料型別
JS大家都這麼熟了,我們來介紹一下TS的新朋友:
1. 空值 void: 沒有回傳值
一般
void
用於沒有回傳值的 funciton 中 可以用我們之前寫的consoleAge來改一下 來表示consoleAge不會回傳任何值typescriptfunction consoleAge(age: string | number): void { console.log(age); }
1
2
3※ 在參數括號外
: 型別
代表該 function 回傳的類型2. 任意 any: 不檢查型別(畢竟我誰都是)
可以想像成 let age; 的感覺, 只知道有這個人,但他誰都可以是。 在TS中宣告時如果沒有指定型別,一律
Inference(推論)
為any
typescriptfunction consoleAge(age): void { console.log(age); // age什麼值都可以! }
1
2
3※ 不要濫用
any
型別,這樣跟沒用TypeScript一樣 甚至更赤裸了...3. 任意 unknown: 不檢查型別(畢竟我誰都是)
unknown
和any
一樣可以接受任何型別賦值, 但any
可以賦值給任何型別,unknown
只能賦值給any
和自己。typescriptfunction consoleAge(age: unknown): void { let name: string = 'Opshell'; name = age; // Error:類型 string 不可指派給 unknown }
1
2
3
44. 絕不 never: 永遠不存在值的型別
這邊可以用之前的例子來舉證, 這個情況下
age
永遠不會有值, 所以是never
typescriptfunction consoleAge(age: string & number) { console.log(age); }
1
2
3或者可以是另一個情況, 像這種無窮迴圈,在TS的
Inference(推論)
中會判斷回傳為never
, 沒有人可以從無窮迴圈中出來...typescriptlet immortal = function forever(age: number) { while (true) { age++; } }
1
2
3
4
5※
never
類型,只能用never
賦值, 但是never
可以賦值給所有型別, 也就是說,never
是所有型別的子類, 可以理解為,所有物件都有錯誤的可能。※ 可以發現
void
和never
很接近, 最值觀的差別是會不會結束?void
函式 會完整結束只是沒有要回傳;never
函式 無法完整跑完,無法回傳。因為
never
的特性緣故, 很常用來處理錯誤。boolean
裡其實也含有never
(never
是所有型別的子類) 所以:boolean
和:boolean | never
是一樣的 有興趣的可以把:boolean | never
寫出來觀察一下 TS 只會說age的回傳是boolean
型別typescriptfunction ageIsString(age: string | number): boolean{ if (typeof age === 'string') { return true; } else if (typeof age === 'number') { return false; } //TS 推論此為 never 型別 return fail('Age cannot be expressed in this way!'); } function fail(message: string): never { throw new Error(message); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
小結:
可以發現TypeScript, 非常努力補足JavaScript沒有算處理的部分, 讓程式碼都變得更井然有序、更容易讀懂, 而且除了型別以外的地方, 基本上都還是按照JS 原來的操作。 可以明確感受到 "TypeScript是JavaScript的型別外掛"
never
與void
讓我們更容易了解函式的回傳, 對於理解他人程式碼相對容易非常多。