为什么空接口不要求对象为空?
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; }' is not assignable to type 'B'
.
- 如果接口定义了对象必须具有的属性,则 B 情况应该可以正常工作,所有必需的属性都存在。
- 如果接口定义了对象可以具有哪些属性,则情况应该会导致错误,
a
接口中没有定义。
非空接口定义了对象可以和必须具有的内容。
空界面的行为类似于any
.
有没有解释为什么空接口的行为如此?这是故意的还是只是一个错误?
这种行为是故意的。
当目标是空对象类型时,不会执行多余的属性检查,因为很少有只允许空对象的意图。
其实,你can assign {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
当您的类型为空时,此约束将被忽略。
阅读更多here https://github.com/Microsoft/TypeScript/issues/3755 and here https://basarat.gitbooks.io/typescript/content/docs/types/freshness.html.
Typescript 团队稍后提供的答案可在GitHub https://github.com/Microsoft/TypeScript/issues/14606#issuecomment-285956509.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)