Skip to content

Latest commit

 

History

History
120 lines (89 loc) · 1.91 KB

复合类型.md

File metadata and controls

120 lines (89 loc) · 1.91 KB

交叉类型

语法:

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;

keyof 关键字

语法

// 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键的索引名