Что такое структурная типизация

  —  2 минуты

#theory#typescript#web
Читать статью в Telegram

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

У нас есть два типа Fireman и Programmer, а также функция, принимающая объект типа Fireman:

typescript
1type Fireman = {
2    name: string
3}
4
5type Programmer = {
6    name: string
7}
8
9const fireman: Fireman = {
10    name: "Alex"
11}
12
13const programmer: Programmer = {
14    name: "Denis"
15}
16
17const foo = (person: Fireman) => { ... }
18

Номинальная типизация:

typescript
1foo(fireman) // OK
2foo(programmer) // Error
3

Но почему во втором случае ошибка? Потому что разные типы: функция ожидает на вход Fireman, а получает Programmer. Сравнение происходит только по самому типу.

А вот пример со структурной типизацией:

typescript
1foo(fireman) // OK
2foo(programmer) // OK
3

В этом случае всё отработает корректно, но только потому что Programmer и Fireman абсолютно идентичны по своей структуре.

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

typescript
1type Fireman = {
2    name: string;
3}
4
5type Programmer = {
6    name: string;
7    age: number
8}
9
10const fireman: Fireman = ...
11const programmer: Programmer = ...
12
13const foo = (person: Fireman) => { ... }
14
15foo(fireman) // OK
16foo(programmer) // OK
17

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

Для языка не важно, что у Programmer есть какие-то дополнительные поля. Главное, чтобы присутствовали все из типа Fireman и имели такой же тип.

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

Статья была полезной?