TS資料型別:型別別名/聯合型別/字面量型別/型別推論等綱要

zhoulujun發表於2020-09-18

在學C/C++  Java等強型別語言時,變數型別是唯一的,需要先指定。PHP JavaScript等弱型別語言時,無需指定變數型別

但是,TypeScript裡面的聯合型別 (Union Type) 和字面量型別 (Literal Type),為了真香定律,還是琢磨下

型別別名

型別別名用來給一個型別起個新名字,使用 type 建立型別別名,型別別名常用於聯合型別。

type nameStr = string;
type nameArr = string[];
type nameType = nameStr | nameArr;

在實際應用中,有些型別名字比較長或者難以記憶,重新命名是一個較好的解決方案。

 

聯合型別-Union Type

聯合型別表示的值可能是多種不同型別當中的某一個。比如,A | B 聯合型別的某個值就可能是 A 型別,也可能是 B 型別。很顯然,聯合型別放寬了型別的取值的範圍,也就是說值的範圍不再限於某個單一的資料型別。同時,它也不是無限制地放寬取值的範圍,如果那樣的話,完全可以使用 any 代替。

type SeriesOfTypes = string | number | boolean | Error;

提示:我們在建立聯合型別的時候,可以使用 type 關鍵字為自定義的聯合型別加上別名,這樣可以避免我們重複它們的定義

字面量型別-Literal Type

字面量也就是 JavaScript 基元型別具體的值。而在 TypeScript 中,我們可以將字面量作為一種自定義的型別,這種型別被稱為字面量型別。比如:

type China = 'China';
let country: China = 'China';  // ok
country = 'America';  // error: Type '"America"' is not assignable to type '"China"'

結合上面所瞭解到的聯合型別,我們可以將自定義的字面量型別組合成一個新的聯合型別:

type Weekdays = 1 | 2 | 3 | 4 | 5;

let day: Weekdays = 1;  // ok
day = 5;  // ok
day = 6;  // error: Type '6' is not assignable to type 'Weekdays'.

字面量聯合型別的形式與列舉型別有些類似,所以,如果您僅是使用數字,可以考慮是否使用給具有表達性的列舉型別。

型別推論

上面說到沒有指定型別的變數預設為any型別的,但是當宣告變數時定義了該變數值,則預設變數為該值得型別值,這就是型別推論

let anyThing = 'string'
anyThing=10 // error  Type '10' is not assignable to type 'string'.

若宣告時未定義,則不會

let anyThing
anyThing='string'
anyThing=10 // ok

型別推論常會成為新手的絆腳石

型別斷言

可以用來繞過編譯器的型別推斷,手動指定一個值的型別。

有時還我們還不知道一個值的型別,導致在開發過程中總是報一些令人頭痛的型別錯誤。使用斷言,簡單來說就是先做好一個假設,使得編譯通過。

語法有下面兩種

  1. <型別>值  

  2.  值 as 型別

推薦第二種,因為 jsx 這樣的語法中只支援 as 方式。

function func(val: string | number): number {
  if ((val as string).length) {
    return (val as string).length
  } else {
    return val.toString().length
  }
}

型別斷言更像是型別的選擇,而不是型別轉換

 

 

轉載本站文章《TS資料型別:型別別名/聯合型別/字面量型別/型別推論等綱要》,
請註明出處:https://www.zhoulujun.cn/html/webfront/ECMAScript/typescript/2018_0411_8369.html

相關文章