Структурная типизация — это подход в языках программирования, который позволяет сократить количество возможных ошибок с типами, а также приведения типов, и сопоставлять не сами типы, а их структуры. Антонимом для структурной типизации является понятие номинальная типизация. Сразу же рассмотрим пример и сравним оба варианта:
У нас есть два типа Fireman и Programmer, а также функция, принимающая объект типа Fireman:
typescript1type 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
Номинальная типизация:
typescript1foo(fireman) // OK 2foo(programmer) // Error 3
Но почему во втором случае ошибка? Потому что разные типы: функция ожидает на вход Fireman, а получает Programmer. Сравнение происходит только по самому типу.
А вот пример со структурной типизацией:
typescript1foo(fireman) // OK 2foo(programmer) // OK 3
В этом случае всё отработает корректно, но только потому что Programmer и Fireman абсолютно идентичны по своей структуре.
Также будет работать и в случае, если один из типов будет являться подмножеством другого:
typescript1type 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 и имели такой же тип.
В этом и заключается весь смысл структурной типизации.
Статья была полезной?
Читайте также:
— 3 минуты
Составные компоненты
Есть такой паттерн для реакта, который называется Compound Components. Это...
— 2 минуты
В чем заключается разница между интерфейсом и типом?
Для меня большое удивление, что я до сих пор не смог найти нормального мате...
— 3 минуты
Дженерики
Сколько я не бился в попытках объяснить что такое дженерик, кажется, что эт...