Я очень рад 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? Я не смог найти ничего об этом в спецификациях языка, это должно быть при работе с классами/интерфейсами.
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
имеет те же проблемы. Поскольку это язык, который все еще находится в разработке, я рекомендую вам указать предложение такого объекта.
Смотрите также:
Тип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
Std.is(pet, Fish)
, который работает с типами, интерфейсами и т. Д.
isFish
- это предикат, который создается, и его тело не должно быть предикатом с одной строкой. Преимущество этого состоит в том, что компилятор понимает во время компиляции соответствующие возможные функции, но ваш код внутри isFish
выполняется во время выполнения. Вы могли бы даже сделать так, чтобы сторож содержал оператор instanceof
, например, return pet instanceof Fish
(предполагая, что это класс, а не интерфейс), но это было бы ненужным, так как компилятор понимает instanceof
напрямую.