我希望B类不能像C类那样通过。
C类的编译错误如下:
键入'{name:string;一些:字符串; }”不可分配给“信息”类型。 对象文字只能指定已知的属性,而'Info'类型中不存在'some'。
interface Info {
name: string;
}
interface Person {
info(): Info;
}
class B implements Person {
info() {
return {
name: "li",
some: "1",
};
}
}
class C {
info():Info {
return {
name: "li",
some: "1",
};
}
}
答案 0 :(得分:1)
TypeScript仅当您在立即知道所需类型的上下文中使用对象文字时才检查多余的属性,例如在类C中(因为您注释了返回类型)。在类B中,TypeScript首先根据返回的表达式info
来推断{name: string, some: string}
的返回类型。到那时,多余的属性检查已被跳过。然后TypeScript检查推断的类型是否可分配给接口指定的类型Info
。
不幸的是,类C的错误消息具有误导性。通常,类型{ name: string; some: string; }
是 可以分配给类型Info
;只是类型为{ name: string; some: string; }
的“新鲜”对象文字,不能分配给Info
。