Я новичок в TypeScript, когда я изучаю интерфейс в TypeScript, я нахожу некоторые функции, которые я не понимаю.
Я попробовал коды, которым следовали на игровой площадке: https://www.typescriptlang.org/play/
interface LabelledValue {
size?: number;
}
function printLabel(labelledObj: LabelledValue) {
}
let myObj = {label: "Size 10 Object"};
printLabel(myObj); // error: Type '{ label: string; }' has no properties in common with type 'LabelledValue'.
Однако, когда я устанавливаю свойство size
в myObj
, оно работает, ошибок не возникает.
interface LabelledValue {
size?: number;
}
function printLabel(labelledObj: LabelledValue) {
}
let myObj = {label: "Size 10 Object", size: 10};
printLabel(myObj);
Насколько я знаю, size
— это просто необязательное свойство, зачем оно нужно, и когда я его не ставлю, возникает ошибка.
Это не имеет ничего общего с необязательным параметром. Хотя бы одно из свойств должно совпадать. Поскольку размер — единственное свойство, присутствующее в интерфейсе, оно должно присутствовать и в объекте, который вы пытаетесь преобразовать. Если я добавлю другое свойство и заполню его вместо размера, оно сработает
interface LabelledValue {
size?: number;
something: string;
}
function printLabel(labelledObj: LabelledValue) {
}
let myObj = {label: "Size 10 Object", something: "Hello"};
printLabel(myObj);
Это поведение было введено этим пиар некоторое время назад. Основная идея заключается в том, что если тип имеет только необязательные свойства, он считается «слабым». Это проблема, так как любой другой тип будет совместим со слабым типом. Учитывая эту проблему, было решено, что хотя бы одно свойство должно совпадать со слабым типом, чтобы назначение было разрешено. Из пиара:
A weak type is one which has only optional properties and is not empty. Because these types are assignable from anything except types with matching non-assignable properties, they are very weakly typechecked. The simple fix here is to require that a type is only assignable to a weak type if they are not completely disjoint.
В TypeScript 2.4 и более поздних версиях: typescriptlang.org/docs/handbook/release-notes/…
Связанный? stackoverflow.com/questions/42537727/…