Last updated on Oct 6, 2022
先看看类型别名(Type Alias)
type StatusCode = 200 | 301 | 400 | 500 | 502
type PossibleDataTypes = string | number | (() => unknown)
const status: StatusCode = 502
除此之外,类型别名还可以声明自己能够接受泛型。一旦接受了泛型,就成了工具类型
type Factory<T> = T | number | string
// 方式一
const foo: Factory<boolean> = true
// 方式二
// 一般不会直接使用工具类型来做类型标注,而是再声明一个新的类型别名
type FactoryWithBool = Factory<boolean>
const foo: FactoryWithBool = true
泛型参数的名称(上面的 T )也不是固定的。通常我们使用大写的 T / K / U / V / M / O ...这种形式
type MaybeArray<T> = T | T[]
function ensureArray<T>(input: MaybeArray<T>): T[] {
return Array.isArray(input) ? input : [input]
}
Union Type,联合类型可以理解为:它代表了**一组类型的可用集合。**只要最终赋值的类型属于联合类型的成员之一,就可以认为符合这个联合类型。联合类型对其成员并没有任何限制,可以将各种类型混合到一起:
interface Tmp {
mixed: true | string | 599 | {} | (() => {}) | (1 | 2)
}
联合类型的符号是|,它代表了按位或。即只需要符合联合类型中的一个类型,就可以认为实现了这个联合类型,如:A | B,只需要实现 A 或 B 即可
Intersection Type,交叉类型它和联合类型的使用位置一样,只不过符号是&,即按位与运算符。需要符合这里的所有类型,才可以说实现了这个交叉类型,即 A & B,需要同时满足 A 与 B 两个类型才行。
对于对象类型的合并:
interface NameStruct {
name: string
}
interface AgeStruct {
age: number
}
type ProfileStruct = NameStruct & AgeStruct
const profile: ProfileStruct = {
name: 'Samuel',
age: 18,
}
对于原始类型的合并:
type StrAndNum = string & number // never