Выбор ответа Senior Классы и интерфейсы обновлено
Структурная типизация классов
Вопрос
Скомпилируется ли код?
class UserId { constructor(public value: string) {} }
class OrderId { constructor(public value: string) {} }
function loadOrder(id: OrderId) {}
loadOrder(new UserId('u1'));
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Да: классы сравниваются структурно, форма у обоих { value: string }. Классы в TS это тоже структурные типы: важна форма экземпляра, а не имя класса.
Варианты ответа
- Да: классы сравниваются структурно, форма у обоих
{ value: string }правильный ответ - Нет: TS сравнивает классы по имени, поэтому
UserIdне подходит кOrderId - Нет: у классов разные конструкторы, и TS сверяет их при присваивании
- Да, но только с
strict: false, а в строгом режиме будет ошибка
Разбор
Классы в TS это тоже структурные типы: важна форма экземпляра, а не имя класса. Поэтому UserId и OrderId взаимозаменяемы. Исключение: если в классе есть private, protected или #-поля, совместимы только экземпляры с тем же объявлением этого поля, и это один из способов сделать номинальный тип. Другой способ: branded-поле. От strict поведение не зависит.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.