Skip to content

自定义类型

联合类型

联合类型:取值为多个值的一种,使用 | 分隔

tsx
let myFavoriteNumber: string | number
myFavoriteNumber = 'seven' // OK
myFavoriteNumber = 7 // OK

类型别名

类型别名用来给一个类型起个新名字。只是取了新名字,并不是创建新类型。

tsx
type Message = string | string[]
let greet = (message: Message) => {
  // ...
}

交叉类型

交叉类型:多个类型合并为一个类型。使用 & 定义交叉类型

tsx
type IntersectionType = { id: number; name: string } & { age: number }
const mixed: IntersectionType = {
  id: 1,
  name: 'name',
  age: 18
}

交叉类型同名问题

基础类型交叉

string 和 name 交叉后为 never

tsx
type IntersectionTypeConfict = { id: number; name: string } & { age: number; name: number }
const mixedConflict: IntersectionTypeConfict = {
  id: 1,
  name: 2, // ts(2322) 错误,'number' 类型不能赋给 'never' 类型
  age: 2
}

number 和 数字字面量 交叉后为 数字字面量

tsx
type IntersectionTypeConfict = { id: number; name: 2 } & { age: number; name: number }

let mixedConflict: IntersectionTypeConfict = {
  id: 1,
  name: 2, // ok
  age: 2
}
mixedConflict = {
  id: 1,
  name: 22, // '22' 类型不能赋给 '2' 类型
  age: 2
}

非基本数据类型交叉

同名属性直接合并,然后判断是基础类型还是非基础类型后,按照规则进行。

tsx
interface A {
  x: { d: true }
}
interface B {
  x: { e: string }
}
interface C {
  x: { f: number }
}
type ABC = A & B & C
let abc: ABC = {
  x: {
    d: true,
    e: '',
    f: 666
  }
}