gpt4 book ai didi

typescript - 空接口(interface)允许任何对象?

转载 作者:搜寻专家 更新时间:2023-10-30 21:02:52 24 4
gpt4 key购买 nike

为什么空接口(interface)不要求对象为空?

interface A {};
const a: A = {a: 1};
console.log(a);

是有效代码,将输出 { a: 1 }

我认为添加可选属性应该没问题,但是

interface A {};
interface B extends A {
b?: any;
}
const a: B = {a: 1};
console.log(a);

以错误结束 Type '{ a: number; }' 不可分配给类型 'B'

  • 如果接口(interface)定义对象必须具有的属性,B 情况应该可以正常工作,所有必需的属性都存在。
  • 如果接口(interface)定义了对象可以具有的属性,A case 应该会导致错误,a 没有在接口(interface)中定义。

非空接口(interface)定义了对象可以和必须具有的内容。空接口(interface)的行为类似于 any

是否有解释为什么空接口(interface)会这样?这是故意的还是只是一个错误?

最佳答案

此行为是故意的。

当目标是空对象类型时,不会执行多余的属性检查,因为很少有意图只允许空对象。


实际上,您可以{a: 1}赋值给B,这里的其他答案大多是错误的。

您偶然发现了 TypeScript 中另一个有点令人困惑的怪癖,即您不能直接将对象字面量分配给对象字面量包含类型中指定属性以外的其他属性的类型。

但是,您可以将对象的任何现有实例分配给一个类型,只要它满足该类型即可。

例如:

interface Animal {
LegCount: number;
}

let dog: Animal = { LegCount: 4, Fur: "Brown" }; // Nope

var myCat = { LegCount: 4, Fur: "Black" };
let theCat: Animal = myCat; // OK

当您的类型为空时,此约束将被忽略。

阅读更多 herehere .

Typescript 团队稍后的回答可在 GitHub 上找到.

关于typescript - 空接口(interface)允许任何对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42537727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com