TypeScript: The Definitive Guide
Экскурс в типизацию - Совместимость типов на основе вида типизации
10/49
image/svg+xml

Совместимость Типов (Types Compatibility)


Немаловажной особенностью типизации является понятие совместимости типов.

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

Существует несколько основных механизмов и выбор конкретного, зависит от случая, при котором возникает потребность сопоставления типов данных. Один из таких механизмов состоит из совокупности правил составляющих такое понятие, как типизация. Из существующего множества правил можно выделить несколько групп, которые образуют три вида типизации. Это, номинативная, структурная и утиная.

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

Номинативная Типизация (nominative typing)


Номинативная типизация (nominative typing), устанавливает совместимость типов данных основываясь на идентификаторах типов (ссылках). Простыми словами, при проверке на совместимость, компилятор проверяет иерархию типов на признаки наследования и реализацию интерфейсов. То есть, тип B будет совместим с типом A, только тогда, когда он является его предком (extends). Кроме того, тип B будет совместим с интерфейсом IA только в том случаи, если он или один из его предков реализует его явно (implements).

Как можно понять по изображению выше, при проверке на совместимость типа Bird с типом Animal, компилятор обходит дерево в поисках наличия ссылки на тип Animal и обнаружив её, приходит к выводу, что типы совместимы. Тот же самый процесс требуется для установления совместимости типа Bird с типом интерфейса INameable. Полная картина совместимости изображена на изображении ниже.

Номинативная типизация присуща исключительно статически типизированным языкам.

К языкам со номинативной типизацией относятся - Java, C# и другие.

Структурная Типизация (structural typing)


Структурная типизация - это принцип, определяющий совместимость типов не основываясь на иерархии наследования или явной реализации интерфейсов, а основываясь на их описании.

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

Структурная типизация присуща исключительно языкам с явной типизацией (явная типизация глава Экскурс в типизацию - Сильная и слабая типизация).

К языкам со структурной типизацией относятся - TypeScript, Scala и им подобные.

Утиная Типизация (Duck typing)


Утиная типизация, как и в случаи со структурной типизацией - это принцип, определяющий совместимость типов не основываясь на иерархии наследования или явной реализации интерфейсов, а основываясь на их описании. Простыми словами, утиная типизация ничем не отличается от структурной, за исключением того, что присуща лишь языкам с динамическим связыванием (динамическая типизация).

Термин Утиная типизация произошел от английского выражения duck test, который в оригинале звучит как - Если это выглядит как утка, плавает как утка и крякает как утка, то это, возможно, и есть утка.

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

К языкам с утиной типизацией относятся - Python, JavaScript и другие.

Итоги

Подведем итоги -

  • Совместимость типов - это, механизм, по которому происходит сопоставление типов.
  • Номинативная типизация, определяет совместимость типов данных основываясь на иерархии наследования и явно реализуемых интерфейсах и присуща исключительно статически типизированным языкам.
  • Структурная Типизация, определяет совместимость типов основываясь на их описании и присуща исключительно статически типизированным языкам.
  • Утиная Типизация, как и в случаи со структурной типизацией, определяет совместимость типов основываясь на их описании и присуща исключительно языкам с динамической типизацией.