首页 > 解决方案 > 是否可以定义一个总是应用过多属性检查的接口/类型?

问题描述

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

interface Example {
    id: number;
    name: string;
}
// ...
function doSomething(ex: Example) {
    // ...
}

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

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'.
});

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

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

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

如果没有,它很容易在运行时完成,但如果在类型定义中有办法做到这一点,那将很有用。

标签: typescript

解决方案


您正在寻找的是确切的类型。GH一直在讨论这个特性,但它还没有真正实现。令人担忧的是(至少从我在 tsConf 从 Anders 那里听到的)是精确类型会创建一个分叉的类型系统,您无法在其中从精确类型到不精确类型以及向后分配,这会使开发体验变得更糟。

有一些变通方法,但在某些方面都存在缺陷,您可以阅读 GH 问题以找到可能运行良好的各种版本,具体取决于您尝试执行的操作。


推荐阅读