TypeScript界面​​中的可选属性存在一些问题

时间:2019-05-22 12:17:02

标签: typescript

我是TypeScript的初学者,当我学习TypeScript的Interface时,会发现一些我不理解的功能。

我尝试了在操场上遵循的代码: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只是一个可选属性,为什么它是必需的,而当我不设置它时,就会发生错误。

2 个答案:

答案 0 :(得分:2)

此行为是PR前一段时间引入的。基本思想是,如果类型仅具有可选属性,则将其视为“弱”。这是一个问题,因为任何其他类型都将与弱类型兼容。鉴于此问题,已决定至少一个属性必须与弱类型匹配才能允许分配。从PR:

  

弱类型是仅具有可选属性且不为空的类型。由于除了具有匹配的不可分配属性的类型之外,这些类型都可以从任何其他类型进行分配,因此它们的类型检查非常弱。一个简单的解决方法是要求类型只有在不完全不相交的情况下才可以分配给弱类型。

答案 1 :(得分:0)

它与可选参数无关。至少其中一个属性必须匹配。由于size是接口中存在的唯一属性,因此它必须存在于您要投射的对象中。如果我添加另一个属性并填充它(而不是大小),它将起作用

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

请参见https://som.sh/fd6f6