联合类型 |

功能类似 ,可以取其中任一类型

  1. let course1 : string|number = 'abc'

联合类型在使用的时候可以借助类型断言进一步精确到其中一个类型

  1. interface Cat {
  2. name: string;
  3. run(): void;
  4. }
  5. interface Fish {
  6. name: string;
  7. swim(): void;
  8. }
  9. function isFish(animal: Cat | Fish) {
  10. if (typeof (animal as Fish).swim === 'function') { // Fish 才有 swim 方法
  11. return true;
  12. }
  13. return false;
  14. }

交叉类型 &

交叉类型听起来功能像 ,好像要取类型的交集,但实际对对象类型却是取并集
对普通类型却是交集(然而没啥卵用,交集也是 never)

  1. type A = number & string // 等价于type A = never,由此可见交叉类型不适用于基本数据类型
  2. type A = {name: string} & {age: number}
  3. const a:A = {
  4. name: 'frank',
  5. age: 21
  6. }

type 的交叉类型和 interface extends 一样可以用来拓展对象属性类型

  1. type A = {name: string} & {age: boolean}
  2. const a:A = {
  3. name: 'frank',
  4. age: false
  5. }
  6. // 交叉类型用来弥补type 没有继承extends
  7. interface B {
  8. name:string
  9. }
  10. interface C extends B {
  11. age:boolean
  12. }
  13. const c:C = {
  14. name:'df',
  15. age:false
  16. }
  17. // type A 和 interface C 实际类型一样