Согласно документации, "Совместимость типов в TypeScript основана на структурном подтипировании".Так что это возможно:
type Person: {
name: string;
}
const developer = {
name: 'Joe',
language: 'Typescript',
}
// this is ok because Person is a subtype of typeof developer
const otherDeveloper: Person = developer; // who writes code like that?!
Это имеет много последствий, одно из многих - потеря информации о типе при использовании Object.keys:
// "keys" type is array of strings not `name` literal as this would be of course wrong because in runtime "keys" is ['name', 'language']
const keys = Object.keys(otherDeveloper);
Итак, я пытался найтипричина такого подтипа в документах TS, как они обещают, но я не смог найти один
Места, где TypeScript допускает неправильное поведение, были тщательно рассмотрены, и в этом документе мы объясним, где это происходит, имотивирующие сценарии позади них.
Единственное место, где это может быть полезно для меня, - это функция, которая ожидает объект более узкого типа, например:
function getName(person: Person) {
return person.name;
}
getName(developer); // works fine because of subtyping
Я личноне вижу большой проблемы, если бы вам пришлось использовать приведение в таком случае:
getName(developer as Person);
Есть ли другие примеры, которые я мог бы пропустить?