Полное руководство по определениям типов

TypeScript — это строго типизированный язык программирования, основанный на JavaScript. Он обеспечивает проверку типов во время компиляции, и большинство IDE поддерживают проверку типов при вводе кода. TypeScript предназначен для разработки больших приложений. Код TypeScript транскомпилируется в JavaScript, который запускается в браузере.

Безопасность типов имеет важное значение в TypeScript. Это препятствует или предотвращает ошибки типов, возникающие в результате расхождений между различными типами данных. Существует три способа определения типа:

  • Анонимные типы: это безымянные типы, содержащие свойства и методы. Обычно это относится к типам объектов, где определена группа связанных свойств и методов.
  • Псевдонимы типов: это альтернативные имена существующих или вновь созданных типов. Это относится к примитивным типам, типам объектов и многому другому. Его можно просто назвать type.
  • Объявления интерфейса: это имена для вновь созданных типов. Он относится к типам объектов, где определена группа связанных свойств и методов. Его можно просто назвать interface.

Давайте внимательно посмотрим на эти типы.

Анонимные типы являются специальными

TypeScript строго типизирован. Тип переменной, параметра или свойства можно указать с помощью :Type после имени. После двоеточия может быть пробел или несколько пробелов. Type включает все допустимые типы, которые могут быть примитивными типами, анонимными типами, псевдонимами типов или объявлениями интерфейса.

Анонимные типы — это типы без имени, которые содержат свойства и методы. Вот пример анонимных типов:

Параметры функции для grow (строки 1–4) и speak (строка 10) определяются анонимными типами. Это быстрый и грязный способ подавить жалобы на TypeScript, но этот способ ситуативен и сложен в обслуживании.

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

Псевдоним типа и объявление интерфейса имеют разный синтаксис

Псевдоним типа — это имя для любого типа. Синтаксис type <name> = <definition>. Вот пример определения типа объекта:

Строки 1–7 определяют тип Person, который включает в себя свойства (строки 2–5) и методы (строка 6). Каждое свойство имеет имя типа и может быть помечено как readonly (строка 2) или опционально (? в строке 4). Есть два способа определить функцию: как свойство стрелочной функции (строка 5) или как метод нормальной функции (строка 6).

Строки 9–17 определяют record типа Person.

Строка 19 выводит содержимое записи.

Строка 27 вызывает функцию, определяемую свойством, speak1. В строке 28 вызывается определяемая методом функция speak2. Оба они работают одинаково. Выбор способа зависит от личных предпочтений.

Объявление интерфейса определяет группу связанных свойств и методов, описывающих объект. Синтаксис interface <name> { <definition> }.

В предыдущем примере мы меняем type на interface (строка 1), и все равно работает.

Для определения объектов псевдонимы типов и объявления интерфейсов очень похожи, и в большинстве случаев мы можем свободно выбирать между ними.

Псевдонимы типов работают для любых типов

Псевдонимы типов могут определять или переименовывать любые типы. Он применим для примитивных типов, типов объектов, типов перечисления, типов объединения, типов кортежей, типов пересечения, типов keyof, типов typeof, литеральных типов шаблонов, индексированных типов доступа, отображаемых типов, условных типов, типов интерфейса, типов классов, универсальные типы и т. д.

Объявления интерфейса могут определять только формы объектов, хотя свойства/методы каждого интерфейса могут быть определены любыми допустимыми типами, включая псевдонимы типов и объявления интерфейсов.

Вот interface, построенный на предыдущих примерах type:

И псевдонимы типов, и объявления интерфейсов могут расширяться

И псевдонимы типов, и объявления интерфейсов могут расширяться, хотя их синтаксис отличается. Псевдоним типа extend создается путем пересечения, а объявление интерфейса extend использует встроенный механизм extend. Оба они могут расширяться из одного или нескольких интерфейсов, типов и/или классов.

Классы могут реализовывать интерфейсы и типы

В большинстве случаев класс может реализовывать один или несколько интерфейсов и/или типов. Мы определили WaterAnimal как interface, а FlyingAnimal как type. Класс может реализовать любой из них.

Класс считается статическим планом. Он может реализовать любой интерфейс, который также является статическим планом. Однако класс не может реализовать псевдоним типа, который называет тип объединения.

В приведенном выше коде в строке 3 отображается ошибка:

A class can only implement an object type or intersection of object types with statically known members.

Объявления интерфейса могут иметь слияние объявлений

Объединение объявлений означает, что компилятор объединяет два отдельных объявления, объявленных с одним и тем же именем, в одно определение. Объединенное определение имеет черты обоих исходных объявлений. На самом деле он не ограничивается двумя декларациями. Любое количество объявлений может быть объединено.

Вот пример, когда первый интерфейс (строки 1–5) и второй интерфейс (строки 7–9) сливаются в один комбинированный интерфейс:

Слияние объявлений не работает с псевдонимами типов. Если мы изменим строку 1 и/или строку 7 на type, появится ошибка: Duplicate identifier 'Person'.

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

Заключение

Мы прошли через определения типов. Анонимные типы являются специальными и не рекомендуются. Псевдонимы типов работают для любых типов, а объявления интерфейсов используются для объектов. Для определения объектов они очень похожи, и мы можем свободно выбирать между ними, за исключением того, что класс не может реализовать псевдоним типа, который называет тип объединения.

Спасибо за прочтение. Я надеюсь, что это было полезно. Если вам интересно, ознакомьтесь с другими моими статьями на Medium.