[英]Why can I assign unknown properties to literal object in typescript?
type ExpectedType = Array<{ name: number, gender?: string }>
function go1(p: ExpectedType) {
}
function f() {
const a = [{name: 1, age: 2}]
go1(a) // doesn't complain
go1([{name: 1, age: 2}]) // complain 'Object literal may only specify known...'
go1(['no matter'].map(n => ({name: 1, age: 2}))) // doesn't complain
}
typescript代码如上,我的问题是最后三行不一样吗? 为什么一线可以通过,二线投诉,三线通过?
同样在 typescript 操场上: 操场
将 var a 分配给 go1() 的参数时,似乎将变量 a 分配给另一个 para 变量。 在这种情况下,因为 a 的类型与参数变量类型兼容。 但是如果你把类型改成{name:number, gender:string },还是会出现类型错误。
当分配一个字面量 object 作为参数时,在这种情况下没有类型转换,因此编译器可以检测到这种类型错误。
更多详情请参阅此处。
TypeScript 结构类型系统的基本规则是,如果 y 至少具有与 x 相同的成员,则 x 与 y 兼容。 例如:
interface Named {
name: string;
}
let x: Named;
// y's inferred type is { name: string; location: string; }
let y = { name: "Alice", location: "Seattle" };
x = y;
为了检查 y 是否可以分配给 x,编译器检查 x 的每个属性以在 y 中找到对应的兼容属性。 在这种情况下, y 必须有一个名为 name 的成员,它是一个字符串。 确实如此,因此允许分配。
经过一番研究,我发现答案在 TypeScript 的文档中。
所以最后 3 行之间的区别在于:第 2 行中的参数是 object,而其他 2 行不是,TypeScript 以不同的方式对待字面参数和非字面参数:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.