繁体   English   中英

为什么我可以将未知属性分配给 typescript 中的文字 object?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM