HTML Diff
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>При объединении | мы расширяем тип - увеличиваем число допустимых значений для типа. А при пересечении &amp; - сужаем. Так мы уменьшаем число допустимых значений:</p>
11 <p>При объединении | мы расширяем тип - увеличиваем число допустимых значений для типа. А при пересечении &amp; - сужаем. Так мы уменьшаем число допустимых значений:</p>
12 <p>Попробуйте ответить, что будет, если использовать в пересечении два объектных типа с одинаковым именем поля, но с отличающимися типами. Это распространенная ошибка по невнимательности или из-за недостаточного понимания типов как множеств.</p>
12 <p>Попробуйте ответить, что будет, если использовать в пересечении два объектных типа с одинаковым именем поля, но с отличающимися типами. Это распространенная ошибка по невнимательности или из-за недостаточного понимания типов как множеств.</p>
13 Ответ При пересечении объектных типов, если встречаются поля с одинаковыми именами, то они должны быть совместимы - иметь одинаковый тип. Иначе будет ошибка компиляции, потому что итоговый тип будет `never`.
13 Ответ При пересечении объектных типов, если встречаются поля с одинаковыми именами, то они должны быть совместимы - иметь одинаковый тип. Иначе будет ошибка компиляции, потому что итоговый тип будет `never`.