typeScript中的联合类型和交叉类型

160 阅读1分钟

联合类型(Union Types)表示取值可以为多种类型中的一种。多种类型用 | 来分隔

基本使用

let myNum:string | number;
myNum = 'abc';
myNum = 123;

不能赋值联合类型之外的值

let myNum:string | number;
myNum = true;
// Type 'boolean' is not assignable to type 'string | number'

类型推导

联合类型会按值推导,也就是它的类型会是最后一次赋值的类型,例如:

let myNum:string | number;
myNum = 'abc';
myNum = 123;

let myNewNum: number;
// 因为myNum最后一次的值是number类型的,所以可以把它赋值给myNewNum
myNewNum = myNum;
let myNum:string | number;
myNum = 123;
myNum = 'abc';

let myNewNum: number;
// myNum最后一次赋值是string
myNewNum = myNum;
// Type 'string' is not assignable to type 'number'

联合类型定义数组

如果数组需要有多种类型的值的话,此时就需要使用联合类型来描述

let arr:(number | string)[] = [1, 2, 3, 'abc'];

交叉类型

交叉类型标识一个值同时属于多种类型,通常交叉类型与对象类型一起使用

type Person1 = {name: string, high: string};
type Person2 = {name: string, handsom: string};
type Person3 = Person1 | Person2;
type Person4 = Person1 & Person2;
let person:Person3;
// 联合类型表示其中的一种类型
person = {name: 'a', high: 'b'};
person = {name: 'a', handsom: 'b'};

let person4: Person4;
// 交叉类型表示同时属于多种类型
person4 = {name: 'a', high: 'b', handsom: 'c'};

虽然我们通常把交叉类型与对象同时使用,但是交叉类型也允许使用原始类型成员,但结果类型将成为never类型

type A = string & number & boolean;
let a:A = 'ccc';
// semantic error TS2322: Type 'string' is not assignable to type 'never'