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

147

Я очень рад 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? Я не смог найти ничего об этом в спецификациях языка, это должно быть при работе с классами/интерфейсами.

  • 0
    Для большинства веб-игр, которые я сейчас создаю, я использую Haxe ( haxe.org ), который имеет собственную проверку типов во время выполнения и встроенную строгую типизацию, которая работает удобнее, чем собственные или пользовательские решения. Помимо этого, он имеет хорошие функции, такие как удаление мертвого кода, абстрактные типы и макросы времени компиляции и т. Д.
  • 0
    Удалено уведомление, не связанное с вопросом. Не редактируйте его обратно.
Показать ещё 2 комментария
Теги:
typechecking

2 ответа

210
Лучший ответ

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 имеет те же проблемы. Поскольку это язык, который все еще находится в разработке, я рекомендую вам указать предложение такого объекта.

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

  • 0
    как насчет кадров ... каждый кадр имеет свои собственные конструкторы, так что это приведет к неожиданному сбою ввода, если блоки, если вы используете кадры
24

Тип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

  • 11
    Это не проверка типов во время выполнения, это просто проверка, есть ли у объекта определенное свойство. Это может быть полезно для типов объединения, так что работает для этого конкретного случая, но на самом деле невозможно создать isThingy для всего подобного. Также, если рыба и птица могут плавать, вы обречены. Я рад, что использую Haxe, который имеет надежную проверку типов, так что вы можете использовать Std.is(pet, Fish) , который работает с типами, интерфейсами и т. Д.
  • 3
    Я нашел этот ответ полезным, но я думаю, что вы можете настроить его, чтобы быть немного более точным. Сам isFish - это предикат, который создается, и его тело не должно быть предикатом с одной строкой. Преимущество этого состоит в том, что компилятор понимает во время компиляции соответствующие возможные функции, но ваш код внутри isFish выполняется во время выполнения. Вы могли бы даже сделать так, чтобы сторож содержал оператор instanceof , например, return pet instanceof Fish (предполагая, что это класс, а не интерфейс), но это было бы ненужным, так как компилятор понимает instanceof напрямую.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню