Потому что необходимое свойство
value
уже существует, а остальной мусор пофиг, т.к. в ts структурная типизация, т.е. под сигнатуру
interface Props {
readonly value: string;
}
подходит любой объект у которого есть
value: string
:
const foo = {
value: 'string',
id: 'string'
}
const bar: Props = foo; // ok
Как указал
Alexandroppolus - проверка есть только при явном задании литерала:
const bar: Props = {
value: 'string',
id: 'string' // err
};
Но это специальный случай - предполагается, что задавая литерал вы хотите задать именно объект указанного типа и никакой другого. Однако к парадигме структурной типизации используемой в ts это отношения не имеет, чисто quality of life фича.
P.S. И да, это значит что в потенциале ты можешь сделать так:
interface Props {
readonly value: string;
}
interface Props2 {
readonly value: string;
readonly id?: number;
}
const foo = {
value: 'string',
id: 'string'
}
const bar: Props = foo;
const buz: Props2 = bar;
buz.id?.toFixed(2) // ts ok, runtime error :(