У меня есть следующий фрагмент кода:
interface User {
id: number;
name: string;
}
const newUser = {id: 5, name: "Tom", age: 22}
// throws no error
const user1: User = newUser
// throws:
// Type '{ id: number; name: string; age: number; }' is not assignable to type 'User'.
// Object literal may only specify known properties, and 'age' does not exist in type 'User'.
const user2: User = {id: 5, name: "Tom", age: 22}
Почему первое задание подходит, а второе нет, хотя они делают почти одно и то же?
Ошибка возникает из-за проверки избыточного свойства литеральных объектов (документы). Однако документация немного скудна по причинам, стоящим за этим, что на самом деле не так уж сложно.
В первом примере newUser
может появляться в других частях кода, помимо присваивания user1
, поэтому, даже если мы не будем обращаться к age
в user1
, к нему все равно можно будет получить доступ в другом месте.
Для второго примера это не так. Невозможно получить доступ к свойству age
на user2
, что означает, что нет типизированного способа доступа к этому свойству, и, скорее всего, это ошибка.
К сожалению, не удалось найти его в последних документах, но вы столкнулись с "лишние проверки собственности". Они... причудливые.