Проверка типа класса с помощью TypeScript

Я очень рад TypeScript, поэтому я начал играть с ним. Как разработчик Actionscript, он делает Javascript менее сложным.

Однако в Actionscript можно проверить тип во время выполнения с помощью оператора is:

var mySprite:Sprite = new Sprite(); 
trace(mySprite is Sprite); // true 
trace(mySprite is DisplayObject);// true 
trace(mySprite is IEventDispatcher); // true

Можно ли определить, является ли переменная (extends или) определенным классом или интерфейсом с TypeScript? Я не смог найти ничего об этом в спецификациях языка, это должно быть при работе с классами/интерфейсами.

Ответ 1

4.19.4 Оператор экземпляра

Оператор instanceof требует, чтобы левый операнд имел тип Any, тип объекта или тип типа типа, а правый операнд должен быть типа Any или подтип типа интерфейса Function. Результат всегда имеет булевский примитивный тип.

Таким образом, вы можете использовать

mySprite instanceof Sprite;

Обратите внимание, что этот оператор также находится в ActionScript, но его больше не следует использовать:

Оператор is, новый для ActionScript 3.0, позволяет проверить, является ли переменная или выражение членом данного типа данных. В предыдущих версиях ActionScript оператор instanceof предоставлял эту функциональность, но в ActionScript 3.0 оператор instanceof не должен использоваться для проверки членства в типе данных. Оператор is должен использоваться вместо оператора instanceof для ручной проверки типа, поскольку выражение x instanceof y просто проверяет цепочку прототипов x для существования y (и в ActionScript 3.0 цепочка прототипов не дает полной картины иерархия наследования).

TypeScript instanceof имеет те же проблемы. Поскольку это язык, который все еще находится в разработке, я рекомендую вам указать предложение такого объекта.

Смотрите также:

Ответ 2

ТипScript имеет способ проверки типа переменной во время выполнения. Вы можете добавить функцию проверки, которая возвращает предикат типа. Таким образом, вы можете вызвать эту функцию внутри оператора if и убедиться, что весь код внутри этого блока безопасен для использования в качестве типа, который вы так считаете.

Пример из документов TypeScript:

function isFish(pet: Fish | Bird): pet is Fish {
   return (<Fish>pet).swim !== undefined;
}

// Both calls to 'swim' and 'fly' are now okay.
if (isFish(pet)) {
  pet.swim();
}
else {
  pet.fly();
}

См. Больше: https://www.typescriptlang.org/docs/handbook/advanced-types.html