Структурная типизация не является типизацией уток - PullRequest
0 голосов
/ 01 мая 2018

Как уже упоминалось в руководстве по TypeScript :

Одним из основных принципов TypeScript является то, что проверка типов фокусируется на форме, которую имеют значения. Это иногда называют «типизацией утки» или «структурным подтипом». В TypeScript интерфейсы играют роль именования этих типов, ...


Насколько я понимаю, приведенный выше основной принцип относится не к типизированной утке , а к структурной типизации , поскольку TypeScript является языком статической типизации.

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

Как я понимаю вышеуказанный основной принцип TypeScript?

1 Ответ

0 голосов
/ 01 мая 2018

С Тест на утку и Печать утки и в Википедии

Если это похоже на утку, плавает как утка и крякает как утка, то это, вероятно, утка.

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

Сформируйте страницу, на которую вы ссылались:

interface LabelledValue {
    label: string;
}

function printLabel(labelledObj: LabelledValue) {
    console.log(labelledObj.label);
}

let myObj = {size: 10, label: "Size 10 Object"};
printLabel(myObj);

Несмотря на то, что myObj явно не реализует интерфейс LabelledValue, он имеет такую ​​же структуру и, следовательно, неявно реализует интерфейс. Это утка набрав

ОБНОВЛЕНИЕ Если интерфейс LabelledValue определен как класс, то приведенный выше код не будет "компилироваться". Это структурный набор текста.

Примечание У TypeScript нет проверки во время выполнения, поскольку он «скомпилирован» до JavaScript

...