created at 2023/08/05 04:33:25
updated at 2023/08/05 04:56:09
联合类型用|
分隔,表示取值可以为多种类型中的一种.
联合类型通常与 null 或 undefined 一起使用:
typescript
const sayHello = (name: string | undefined) => {
/* ... */
};
sayHello('Semlinker');
sayHello(undefined);
TypeScript
可辨识联合(Discriminated Unions
)类型,也称为代数数据类型或标签联合类型。它包含 3 个要点:可辨识、联合类型和类型守卫.
这种类型的本质是结合联合类型和字面量类型的一种类型保护方法。如果一个类型是多个类型的联合类型,且多个类型含有一个公共属性,那么就可以利用这个公共属性,来创建不同的类型保护区块。
typescript
enum CarTransmission {
Automatic = 200,
Manual = 300,
}
interface Motorcycle {
vType: 'motorcycle'; // discriminant
make: number; // year
}
interface Car {
vType: 'car'; // discriminant
transmission: CarTransmission;
}
interface Truck {
vType: 'truck'; // discriminant
capacity: number; // in tons
}
我们分别定义了 Motorcycle、 Car 和 Truck 三个接口,在这些接口中都包含一个 vType 属性,该属性被称为可辨识的属性,而其它的属性只跟特性的接口相关。
typescript
type Vehicle = Motorcycle | Car | Truck;
类型别名用来给一个类型起个新名字。它只是起了一个新名字,并没有创建新类型。类型别名常用于联合类型。
typescript
type Message = string | string[];
let greet = (message: Message) => {
// ...
};
交叉类型就是跟联合类型相反,用&操作符表示,交叉类型就是两个类型必须存在
typescript
interface IpersonA {
name: string;
age: number;
}
interface IpersonB {
name: string;
gender: string;
}
let person: IpersonA & IpersonB = {
name: 'jay',
age: 18,
gender: '男',
};
//person 即是 IpersonA 类型,又是 IpersonB 类型
注意:交叉类型取的多个类型的并集,但是如果 key 相同但是类型不同,则该 key 为 never 类型
typescript
interface IpersonA {
name: string;
}
interface IpersonB {
name: number;
}
function testAndFn(params: IpersonA & IpersonB) {
console.log(params);
}
testAndFn({ name: '111' }); // error TS2322: Type 'string' is not assignable to type 'never'.