@VladMokrousov

Почему Typescript считает аргумент функции корректным?

Привет) На днях столкнулся с интересным поведением Typescript. Я явно дал знать, какой интерфейс должен использовать аргумент функции. Тем не менее, если передать в качестве аргумента значение, которое будет использовать интерфейс с дополнительными полями, ошибки не будет. Почему?
60570f6701c4a573673975.jpeg
interface IValidUser {
  name: string
}
interface IInvalidUser {
  name: string,
  age: number
}

const validUser: IValidUser = {name: 'Pavel'}
const invalidUser: IInvalidUser = {name: 'Nadya', age: 45}
  
const printUser = (user: IValidUser): void => {
  console.log(user)
}

printUser(validUser)
printUser(invalidUser)
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
Тайпскрипт использует структурную типизацию, а не номинативную.
Это значит, что он смотрит не на имена типов, а на их содержимое-структуру.
И вот по структуре Invalid user расширяет Valid user.

Побороться с этим можно, если ввести какую-нибудь несовместимость между этими интерфейсами.
Например добавив поле type с некоторым константным строковым знаяением
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Sun_Day
Насколько я помню, это известная проблема в тайпскрипте. Здесь нет такой точности типов на уровне дизайна языка, но то что вы ожидаете есть во Flow.
Обсуждалось здесь:
https://github.com/Microsoft/TypeScript/issues/12936
Почти 5 лет, да, взгляните на количество ишьюс). Все обсуждение не читал, руки не доходят, но вроде подвижки есть.
Ответ написан
Комментировать
yarkov
@yarkov
Помог ответ? Отметь решением.
А почему нет? Попробуйте передать в функцию не переменную, а сам объект - увидите разницу.
https://www.typescriptlang.org/play?#code/JYOwLgpg...

60571766537fe971401770.png
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы