是否可以定义总是对其应用多余属性检查的接口/类型?

时间:2020-03-30 10:55:13

标签: typescript

在TypeScript中,多余的属性检查将应用于对象文字,但不能超过此范围。 (这是有意的documented behavior。)因此:

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

此操作失败(playground link):

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

但这不是(playground link):

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

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

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

1 个答案:

答案 0 :(得分:4)

您要查找的是确切类型。此功能自GH以来一直在讨论中,但尚未接近实际实现。令人担忧的是(至少从我在Anders tsConf上所听到的)是,精确类型会创建一个分叉的类型系统,在这种系统中,您不能将精确类型分配给不精确的类型,也不能反向分配,这会使开发人员的体验更加糟糕。

有解决方法,但都存在某些缺陷,您可以阅读GH问题,以找到各种版本,这些版本可能会根据您要尝试的工作而发挥足够的作用。