是否可以定义一个始终应用多余属性检查的接口/类型?

T.J*_*der 3 typescript

在 TypeScript 中,过多的属性检查应用于对象文字,但不会超出范围。(这是有意记录的行为。)因此:

interface Example {
    id: number;
    name: string;
}
// ...
function doSomething(ex: Example) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这失败了(游乐场链接):

doSomething({
    id: 42,
    name: "Life, the Universe, and Everything",
    extra: "not allowed" // Error 2345: Object literal may only specify known properties, and 'extra' does not exist in type 'Example'.
});
Run Code Online (Sandbox Code Playgroud)

但这不是(游乐场链接):

const ex = {
    id: 42,
    name: "Life, the Universe, and Everything",
    extra: "not allowed"
};
doSomething(ex);
Run Code Online (Sandbox Code Playgroud)

是否可以以某种方式定义接口,即使不使用对象文字,也禁止多余的属性?例如,final某种“”界面?

如果没有,它很容易在运行时完成,但如果有一种方法可以在类型定义中完成它,那将很有用。

Tit*_*mir 5

您正在寻找的是精确类型。这个功能在GH上一直在讨论,但距离实际实现还差得远。令人担忧的是(至少从我在 tsConf 上从 Anders 那里听到的),精确类型会创建一个分叉的类型系统,您无法从精确类型到不精确类型以及向后分配,这将使开发体验变得更糟。

有一些解决方法,但都在某种程度上存在缺陷,您可以阅读 GH 问题来查找可能工作得足够好的各种版本,具体取决于您想要执行的操作。