Под капотом Typescript — это Javascript, а Javascript странный. Typescript поставляется с предпосылкой привнести некоторую здравомыслие в Javascript за счет использования системы типов, которая отлавливает ошибки типов во время компиляции, а не во время выполнения. Явное написание типов без использования приведения типов почти не требует дополнительного времени, но дает нам преимущество в виде лучшего инструментария во время разработки, а также большей уверенности в том, что программное обеспечение будет выпущено без ошибок.

Дело о машинописном тексте

Даже создатель Javascript Брендан Эйх сожалеет о том, что поторопился с приведением типов и сделал его неаккуратным. Если вы не знакомы с термином «приведение типов», я хочу быстро объяснить вам, о чем идет речь:

Приведение типов в Javascript позволяет делать неявные приведения типов, что позволяет выполнять операции над переменными разных типов. Обратите внимание, что каждая переменная Javascript имеет тип, даже если он не указан явно.

Из-за приведения типов на самом деле могут происходить неожиданные вещи, подобные этим:

const nope = Array(10).join("nope" - 1) + " Batman!";
console.log(nope); // --> NaNNaNNaNNaNNaNNaNNaNNaNNaN Batman!
const a = [ 1, 2, 3 ];
const b = [ 1, 2, 3 ];
console.log(a + b); //-> 1,2,31,2,3

Это проясняет мою мысль о том, что нам действительно нужен Typescript. И, если честно, Typescript — это лучшее, что когда-либо случалось с Javascript, но он все еще не может решить все проблемы, которые есть у Javascript, по одной серьезной причине:

Typescript преобразовывается в Javascript, что означает, что код Typescript никогда не выполняется, а всегда преобразуется в Javascript. С одной стороны, это означает, что у нас нет доступа к типам Typescript во время выполнения, но, с другой стороны, это позволяет легко перейти с Javascript на Typescript, поскольку это можно сделать постепенно.

Тип

В объектно-ориентированном программировании охранники типов, такие как typeof или instanceof, используются для определения типа или класса переменной. Это особенно полезно при полиморфизме (позволяет подключать конкретные подклассы к определениям суперклассов во время выполнения) для создания чего-то вроде фабричного шаблона, который создает определенный объект в зависимости от некоторой внутренней логики:

Попался! Это первый улов. Вероятно, вы ожидали, что тип x будет Small, а тип y — Big, поскольку это обычная практика ООП. Есть две вещи, которые нужно знать:

  1. Во время выполнения нет машинописного текста. typeof() выполняется во время выполнения и поэтому не имеет доступа к определениям типов Typescript.

2. Классы в Javascript — это, по сути, просто куча синтаксического сахара только для функции-конструктора и объекта с определенным прототипом.

Обратите внимание, что если для интерфейса используется typeof, вывод по-прежнему будет «Object», потому что интерфейсы не транспилируются во что-либо в javascript. Каждая переменная, имеющая тип интерфейса, в основном является просто объектом-прототипом.

Случай

Instanceof, с другой стороны, действительно очень полезен для нас, потому что он действительно может определять конкретные классы, проверяя, наследуется ли прототип объекта от прототипа указанного определения объекта.

Например, p instanceof Person будет выглядеть, если p.prototype наследуется от Person.prototype. Обратите внимание, что я намеренно использовал слово «наследовать», поскольку прототип объекта связан со всеми его супер/базовыми прототипами.

Например, почти все прототипы наследуются от Object.prototype.

В этом примере мы видим, что прототип x связывает Small, BaseClass и Object именно в таком порядке. Следовательно, instanceof этих классов возвращает true, тогда как instanceof Big возвращает false.

С помощью магии Javascript мы можем вручную изменить прототип класса Small на Big.prototype. Таким образом, instanceof переменной, созданной с помощью конструктора Small, теперь будет экземпляром Small, BaseClass, Object, но также и Big, потому что Big и Small теперь имеют один и тот же прототип.

Это означает, что пока прототип тот же, instanceof вернет true.

Интерфейсы

Этот короткий раздел здесь для того, чтобы явно указать, что интерфейсы не могут использоваться с typeof или instanceof осмысленным образом, потому что интерфейсы полностью удаляются, когда Typescript транспилируется в Javascript, поскольку они не содержат ничего, кроме определений переменных и типов. Заключение о том, что интерфейс живет только в пространстве Typescript и, следовательно, не существует во время выполнения typeof и instanceof, которые, с другой стороны, выполняются во время выполнения, бесполезно.

Заключение

Typescript великолепен, но, поскольку он не работает во время выполнения, мы все равно должны помнить о функциях Javascript, и хотя типы определены в Typescript, функции typeof и instanceof вообще не связаны с Typescript. Вы узнали, что typeof не очень полезен для проверки того, наследуется ли объект от класса, но в этом случае может помочь instanceof. Интерфейсы не должны использоваться ни с typeof, ни с instanceof.