0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В JavaScript возможно работать с объектами и классами одинаковым образом. При этом не нужно опираться ни на наследование, ни на интерфейсы. Нужны только ожидаемые поля и методы. Такой подход называют<strong>утиной типизацией</strong>(<em>duck typing</em>). Если что-то ходит как утка и крякает как утка - значит, это утка:</p>
1
<p>В JavaScript возможно работать с объектами и классами одинаковым образом. При этом не нужно опираться ни на наследование, ни на интерфейсы. Нужны только ожидаемые поля и методы. Такой подход называют<strong>утиной типизацией</strong>(<em>duck typing</em>). Если что-то ходит как утка и крякает как утка - значит, это утка:</p>
2
<p>В языках как Java нам бы потребовалось определить интерфейс, после отдельно имплементировать его для классов User и Admin. А в параметрах метода форматирования тип аргумента был бы этим интерфейсом.</p>
2
<p>В языках как Java нам бы потребовалось определить интерфейс, после отдельно имплементировать его для классов User и Admin. А в параметрах метода форматирования тип аргумента был бы этим интерфейсом.</p>
3
<p>Другой вариант - написать метод с перегрузкой для этих двух случаев. Языки с таким поведением используют номинативную типизацию (<em>nominative typing</em>).</p>
3
<p>Другой вариант - написать метод с перегрузкой для этих двух случаев. Языки с таким поведением используют номинативную типизацию (<em>nominative typing</em>).</p>
4
<p>Чтобы организовать подход утиной типизации в Java, нужно написать много дополнительного кода.</p>
4
<p>Чтобы организовать подход утиной типизации в Java, нужно написать много дополнительного кода.</p>
5
<p>Чтобы упростить переход с JavaScript на TypeScript и использовать проверки до выполнения кода, был выбран подход структурной типизации. С ней мы и познакомимся в этом уроке.</p>
5
<p>Чтобы упростить переход с JavaScript на TypeScript и использовать проверки до выполнения кода, был выбран подход структурной типизации. С ней мы и познакомимся в этом уроке.</p>
6
<p>С помощью структурной типизации мы можем легко переписать наш пример на TypeScript:</p>
6
<p>С помощью структурной типизации мы можем легко переписать наш пример на TypeScript:</p>
7
<p>При этом структурная типизация не защищает нас от наличия дополнительных полей в объекте:</p>
7
<p>При этом структурная типизация не защищает нас от наличия дополнительных полей в объекте:</p>
8
<p>В структурной типизации об объектном типе можно думать, как об описании структуры, которое накладывает ограничения на присваиваемые значения. Или как о множестве объектов, которые могут быть присвоены переменной с таким типом.</p>
8
<p>В структурной типизации об объектном типе можно думать, как об описании структуры, которое накладывает ограничения на присваиваемые значения. Или как о множестве объектов, которые могут быть присвоены переменной с таким типом.</p>
9
<p>Чем меньше полей в объектном типе, тем менее специфичное ограничение накладывается на присваиваемое значение. На множествах это означает, что объектный тип с дополнительными полями будет подмножеством объектного типа без этих полей. Если говорить о сужении и расширении типа в объектных типах, то дополнительные поля сужают тип.</p>
9
<p>Чем меньше полей в объектном типе, тем менее специфичное ограничение накладывается на присваиваемое значение. На множествах это означает, что объектный тип с дополнительными полями будет подмножеством объектного типа без этих полей. Если говорить о сужении и расширении типа в объектных типах, то дополнительные поля сужают тип.</p>
10
<p>Аналогично операциям со множествами для объектных типов можно сформировать понимание пересечения и объединения в структурной типизации.</p>
10
<p>Аналогично операциям со множествами для объектных типов можно сформировать понимание пересечения и объединения в структурной типизации.</p>
11
<p>При объединении | мы расширяем тип - увеличиваем число допустимых значений для типа. А при пересечении & - сужаем. Так мы уменьшаем число допустимых значений:</p>
11
<p>При объединении | мы расширяем тип - увеличиваем число допустимых значений для типа. А при пересечении & - сужаем. Так мы уменьшаем число допустимых значений:</p>
12
<p>Попробуйте ответить, что будет, если использовать в пересечении два объектных типа с одинаковым именем поля, но с отличающимися типами. Это распространенная ошибка по невнимательности или из-за недостаточного понимания типов как множеств.</p>
12
<p>Попробуйте ответить, что будет, если использовать в пересечении два объектных типа с одинаковым именем поля, но с отличающимися типами. Это распространенная ошибка по невнимательности или из-за недостаточного понимания типов как множеств.</p>
13
Ответ При пересечении объектных типов, если встречаются поля с одинаковыми именами, то они должны быть совместимы - иметь одинаковый тип. Иначе будет ошибка компиляции, потому что итоговый тип будет `never`.
13
Ответ При пересечении объектных типов, если встречаются поля с одинаковыми именами, то они должны быть совместимы - иметь одинаковый тип. Иначе будет ошибка компиляции, потому что итоговый тип будет `never`.