Некоторые проблемы с необязательными свойствами в машинописном интерфейсе

Я новичок в 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 — это просто необязательное свойство, зачем оно нужно, и когда я его не ставлю, возникает ошибка.

Связанный? stackoverflow.com/questions/42537727/…

Caramiriel 22.05.2019 14:24
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
1
1
398
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это не имеет ничего общего с необязательным параметром. Хотя бы одно из свойств должно совпадать. Поскольку размер — единственное свойство, присутствующее в интерфейсе, оно должно присутствовать и в объекте, который вы пытаетесь преобразовать. Если я добавлю другое свойство и заполню его вместо размера, оно сработает

interface LabelledValue {
    size?: number;
    something: string;
}
function printLabel(labelledObj: LabelledValue) {
}
let myObj = {label: "Size 10 Object", something: "Hello"};
printLabel(myObj);

См. https://сом.sh/fd6f6

Ответ принят как подходящий

Это поведение было введено этим пиар некоторое время назад. Основная идея заключается в том, что если тип имеет только необязательные свойства, он считается «слабым». Это проблема, так как любой другой тип будет совместим со слабым типом. Учитывая эту проблему, было решено, что хотя бы одно свойство должно совпадать со слабым типом, чтобы назначение было разрешено. Из пиара:

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/…

Caramiriel 22.05.2019 14:27

Другие вопросы по теме