T1 & T2 & ...
交叉类型是将多个类型合并为一个总的类型,它包含了多个类型的所有特性,类似于编程逻辑中的 且 操作
interface Bird {
fly(): void;
}
interface Dog {
run(): void;
}
// 同时具有Bird的fly和Dog的run特征
class Animal {
fly(){}
run(){}
}
// 正确
let animal: Bird & Dog = new Animal();
T1 | T2 | ...
联合类型是取多个类型中的其中之一,只要满足了其中一个类型,就认为类型兼容。联合类型类似于编程逻辑中的 或 操作
interface Bird {
fly(): void;
}
interface Dog {
run(): void;
}
// 与 Bird 兼容
class Animal1 {
fly(){}
}
// 与 Dog 兼容
class Animal2 {
run(){}
}
// 正确,满足了Bird
let animal1: Bird | Dog = new Animal1();
// 正确,满足了Dog
let animal2: Bird | Dog = new Animal2();
联合类型非常神奇,构成联合类型的组合可以是以下三种方式的任意组合:
- 值与类型
- 值与值
- 类型与类型
// 值与类型混搭
let u: 99 | string | boolean;
u = 'a';
u = 99;
u = true;
// 值与值混搭
let u: 'a' | 'b' | 99;
u = 'a';
u = 'b';
u = 99;
// 类型与类型混搭
let u: number | string | boolean;
u = 99;
u = 'hello world';
u = false;
// T代表类型
keyof T
keyof
关键字作用于类型,通过获取一个类型的所有属性名,生成一个新的字符串值的联合类型:
interface Person {
name: string;
age: number;
}
// 通过keyof关键字声明联合
let keyWord: keyof Person;
// 完全等价于
let keyWord: "name" | "age";
keyWord = "name";
keyWord = "age";
也就是说,keyof
关键字生成的是字符串值的联合,每个字符串值都是被获取类型 T
的键的索引名