typescript中的類型別名和字面量類型


類型別名

類型別名就是給一種類型起個別的名字,之后只要使用這個類型的地方,都可以用這個名字作為類型代替。它只是起了一個名字,並不是創建了一個新類型。

 

定義類型別名,使用 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM