空接口允许任何对象?

mle*_*eko 3 typescript

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

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'.

  • 如果接口定义了对象必须具有的属性,则B case应该正常工作,所有必需的属性都存在.
  • 如果接口定义了对象可以具有的属性,则一个case应该导致错误,a而不是在接口中定义.

非空接口定义了哪个对象可以和必须具有.空接口表现得像any.

有没有解释为什么空接口的行为像这样?这是故意还是只是一个错误?

Ale*_*lex 7

这种行为是故意的.

当目标是空对象类型时,不执行多余属性检查,因为很少只允许空对象.


实际上,你可以分配{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找到.