联合类型(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'