Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 是否可以定义一个始终应用多余属性检查的接口/类型?_Typescript - Fatal编程技术网

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

Typescript 是否可以定义一个始终应用多余属性检查的接口/类型?,typescript,Typescript,在TypeScript中,多余的属性检查应用于对象文字,但不超过该值。这是故意的。因此: interface Example { id: number; name: string; } // ... function doSomething(ex: Example) { // ... } 这失败了: 但这并不是: 是否有可能以某种方式定义接口,即使不使用对象文字,也会禁止多余的属性?例如,某种类型的最终接口 如果没有,则在运行时很容易完成,但是如果在类型定义中有一种方法

在TypeScript中,多余的属性检查应用于对象文字,但不超过该值。这是故意的。因此:

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

但这并不是:

是否有可能以某种方式定义接口,即使不使用对象文字,也会禁止多余的属性?例如,某种类型的最终接口


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

您要查找的是确切的类型。这个特性一直在讨论中,但它还没有真正实现。至少从我在tsConf上从Anders那里听到的担心是,精确类型将创建一个分支类型系统,在这个系统中,您无法从精确类型分配到不精确类型并向后分配,这将使开发人员的体验更加糟糕


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

我非常惊讶将对象文字提取到变量中会绕过多余的检查。这…似乎是一个巨大的疏忽。我不确定这是否是TS的一部分,或者我忽略了一些东西,但考虑到它们都有相同的隐式接口,我不会认为这两者应该得到不同的对待。编辑:文档中提到了它,所以…不知道。@VLAZ-是的,这是TypeScript团队有意做出的决定,是一个务实的妥协。通常,一个满足另一个类型的类型是可以的,即使有额外的位,但是他们认为如果您提供一个对象文本,那么这可能是一个错误,因此,他们在那里应用检查,但记录如果您想要多余的属性,如何绕过检查。我理解这个决定,但将选项提取到变量是一种常见的重构。如果只传递1-3个选项,那么对象文字看起来很好,但如果有更多选项,那么每次写出都会变得很麻烦。因此,我认为存在疏忽。您应该能够像您要求的那样选择过多的属性检查,因为您可能不想通过{area:number;color:string;}。无论如何,我想知道是否有可能使用一个映射类型来实现这一点——让所有其他属性都不存在,或者其他什么。相关的啊,这是搜索词可以找到的。我搜索了最后的和防止扩展之类的。谢谢
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);