Выбор ответа Senior Классы и интерфейсы обновлено

Структурная типизация классов

Вопрос

Скомпилируется ли код?

class UserId { constructor(public value: string) {} }
class OrderId { constructor(public value: string) {} }
function loadOrder(id: OrderId) {}
loadOrder(new UserId('u1'));

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Да: классы сравниваются структурно, форма у обоих { value: string }. Классы в TS это тоже структурные типы: важна форма экземпляра, а не имя класса.

Варианты ответа

  1. Да: классы сравниваются структурно, форма у обоих { value: string }правильный ответ
  2. Нет: TS сравнивает классы по имени, поэтому UserId не подходит к OrderId
  3. Нет: у классов разные конструкторы, и TS сверяет их при присваивании
  4. Да, но только с strict: false, а в строгом режиме будет ошибка

Разбор

Классы в TS это тоже структурные типы: важна форма экземпляра, а не имя класса. Поэтому UserId и OrderId взаимозаменяемы. Исключение: если в классе есть private, protected или #-поля, совместимы только экземпляры с тем же объявлением этого поля, и это один из способов сделать номинальный тип. Другой способ: branded-поле. От strict поведение не зависит.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.