類型別名
類型別名就是給一種類型起個別的名字,之后只要使用這個類型的地方,都可以用這個名字作為類型代替。它只是起了一個名字,並不是創建了一個新類型。
定義類型別名,使用 type 關鍵字:
type StringType = string let s: StringType s = 'hello' s = 123 // error,不能將類型“123”分配給類型“string”。
類型別名也可以使用泛型:
type PositionType<T> = { x: T, y: T } let p1: PositionType<number> = { x: 3, y: 5 } let p2: PositionType<string> = { x: 'right', y: 'top' }
使用類型別名時也可以在屬性中引用自己:
type Next<T> = { val: T, next?: Next<T> // 這里屬性引用類型別名自身 } let list: Next<string> = { val: 'first', next: { val: 'second', next: { val: 'third', next: 'test' // 這里不符合類型別名規定,導致最外層 next 報錯 } } }
但要注意,只可以在對象屬性中引用類型別名自己,不能直接使用,比如這樣是不行的:
type Child = Child[]
這樣定義后會循環引用自身,無法使用,記住類型別名不能出現在聲明右側的任何地方。
類型別名和接口很類似,有時候起到同樣作用:
type Alias = { num: number } interface Interface{ num: number } let _alias: Alias = {num: 1} let _interface: Interface = {num: 2} _alias = _interface
例子中使用類型別名和接口都可以定義一個只包含 num 屬性的對象類型,而且類型是兼容的。到底用接口還是類型別名,通過兩點選擇:
1. 類型別名無法被 extends
和 implements,所以類型需要拓展時,需使用接口;
2. 當無法通過接口,並且需要使用聯合類型或者元組類型時,用類型別名。
字面量類型
字符串字面量類型
字符串字面量類型其實就是字符串常量,與字符串類型不同的是它是具體的值:
type Name = 'Tom' let name1: Name = 'Bob' // error,不能將類型“"Bob"”分配給類型“"Tom"” let name2: Name = 'Tom'
還可以使用聯合類型來使用多個字符串
type Fruit = 'apple' | 'pear' | 'orange' | 'banana' let f1: Fruit = 'peach' // error,不能將類型“"peach"”分配給類型“Fruit” let f2: Fruit = 'apple'
數字字面量類型
數字字面量類型和字符串字面量類型差不多,都是指定類型為具體的值:
type Age = 18 let age1: Age = 17 // error,不能將類型“17”分配給類型“18”。 let age2: Age = 18