为什么空接口不要求对象为空?
interface A {};
const a: A = {a: 1};
console.log(a);
Run Code Online (Sandbox Code Playgroud)
是有效的代码,将输出{ a: 1 }.
我认为添加可选属性应该可以正常工作,但是
interface A {};
interface B extends A {
b?: any;
}
const a: B = {a: 1};
console.log(a);
Run Code Online (Sandbox Code Playgroud)
以错误结束Type '{ a: number; }' is not assignable to type 'B'.
a而不是在接口中定义.非空接口定义了哪个对象可以和必须具有.空接口表现得像any.
有没有解释为什么空接口的行为像这样?这是故意还是只是一个错误?
这种行为是故意的.
当目标是空对象类型时,不执行多余属性检查,因为很少只允许空对象.
实际上,你可以分配{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
Run Code Online (Sandbox Code Playgroud)
如果您的类型为空,则忽略此约束.
来自Typescript团队的原始答案可以在GitHub上找到.
| 归档时间: |
|
| 查看次数: |
6593 次 |
| 最近记录: |