TypeScript 之 interface 小白普及

85 阅读1分钟

类型守卫

in 关键字

in 操作符 可以安全的检查一个对象上是否存在一个属性,它通常也被作为类型保护使用

// 声明 鸭子类型(即 由当前方法和属性的集合决定的类型)
// 也就是有a属性和a1属性的对象,就是属于A鸭子的

// interface就是在 typeScript中 充当 duck typing 这样的角色
// 是一种 规定内外代码契约 的有力方式
interface A {
  a: number;
  a1: string;
}
interface B {
  b: string;
}

// 要求params参数属于A类型或B类型
function doStuff(params: A | B) {
  // 如果 params中有a属性的话,可以推断出 params 是A类型
  if ('a' in params) {
    // 所以按照鸭子类型params一定有a1属性
    console.log(params.a1);
  }
  else {
    // 不是A类型就一定是B类型,所以就一定有b属性
    console.log(params.b);
  }
}

doStuff({ b: '2' }) // 2

总结: interface就是在 typeScript中 充当 duck typing 这样的角色,duck typing即鸭子类型, 就是: 看起来像鸭子的就是鸭子, 有a属性的就是A类型