Typescript: instanceof проверить на интерфейсе

учитывая следующий код:

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". Как правильно справиться с этой ситуацией?

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
    }
  }
}

TypeScript использует duck typing для интерфейсов, поэтому вы должны просто проверить, содержит ли объект некоторые конкретные члены:

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