【问题标题】:instanceof check on interface接口上的instanceof检查
【发布时间】:2015-10-23 06:10:21
【问题描述】:

给定以下代码:

module MyModule {
  export interface IMyInterface {}
  export interface IMyInterfaceA extends IMyInterface {}
  export interface IMyInterfaceB extends IMyInterface {}

  function(my: IMyInterface): void {
    if (my instanceof IMyInterfaceA) {
      // do something cool
    }
  }
}

我收到错误“找不到名称 IMyInterfaceA”。处理这种情况的正确方法是什么?

【问题讨论】:

标签: typescript interface instanceof


【解决方案1】:

TypeScript 对接口使用鸭式类型,因此您应该只检查对象是否包含某些特定成员:

if ((<IMyInterfaceA>my).someCoolMethodFromA) {
    (<IMyInterfaceA>my).someCoolMethodFromA();
}

【讨论】:

  • 请注意,如果您在 .tsx 文件中,&lt;&gt; 语法将不起作用。另一种方法是使用 as: (my as IMyInterfaceA).someCoolMethodFromA 进行投射
【解决方案2】:

由于类型信息不会以任何方式转换为已编译的 JavaScript 代码,因此无法运行时检查接口。

您可以检查特定属性或方法并决定要做什么。

module MyModule {
  export interface IMyInterface {
      name: string;
      age: number;
  }
  export interface IMyInterfaceA extends IMyInterface {
      isWindowsUser: boolean;
  }
  export interface IMyInterfaceB extends IMyInterface {

  }

  export function doSomething(myValue: IMyInterface){
    // check for property
    if (myValue.hasOwnProperty('isWindowsUser')) {
      // do something cool
    }
  }
}

【讨论】:

  • 而不是hasOwnProperty,使用in operator narrowing 更惯用。然后控制流分析/类型推断起作用——如果你做if ('isWindowsUser' in myValue) { ... },那么在条件内,TS 正确地缩小了类型——它推断myValue 实现了IMyInterfaceA
猜你喜欢
  • 2023-03-12
  • 2021-12-21
  • 2012-11-09
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 2017-09-11
相关资源
最近更新 更多