首页 > 解决方案 > 可以将带有附加字段的对象推入类型化数组

问题描述

在 typescript 中使用自定义类型的数组时,我遇到了一个我不明白的问题。我一直认为您只能将自定义类型的新对象推送到数组中。但是,如果我事先定义它,则推送带有附加字段的对象似乎是可能的。

假设我定义了一个自定义类型:

type MyType = {
    fieldOne: string,
    fieldTwo: number,
};

这些情况抛出,IMO 正确,TS 错误(2322),因为fieldThree没有在我的自定义类型中定义:

const temp: MyType = { fieldOne: 'foo', fieldTwo: 2, fieldThree: 'whee'};
const tempArray: MyType[] = [{fieldOne: 'bar', fieldTwo: 2, fieldThree: 'whee'}];
const newArray: MyType[] = [];
newArray.push({fieldOne: 'bar', fieldTwo: 2, fieldThree: 'whee'});

键入'{ fieldOne:字符串;字段二:数字;字段三:字符串;}' 不可分配给类型 'MyType'。对象字面量只能指定已知属性,并且类型“MyType”中不存在“fieldThree”。(2322)

但是,以下带有通用无类型对象的情况不会引发错误并允许我推data入数组:

const newArray: MyType[] = [];
const data = {fieldOne: 'bar', fieldTwo: 2, fieldThree: 'whee'};
newArray.push(data);

假设最后一种情况也应该引发错误,我错了吗?我在这里想念什么?

谢谢!

标签: arraystypescripttypes

解决方案


这在有关多余属性检查的文档中进行了解释。请花点时间阅读它,因为它会照亮这里发生的事情。

特别要注意这一节:

绕过这些检查的最后一种方法(可能有点令人惊讶)是将对象分配给另一个变量:由于 squareOptions 不会进行过多的属性检查,因此编译器不会给您错误。

这解释了您所看到的差异。在这一点上,(松散的)结构类型兼容性是最重要的,并且由于过多的属性而导致的不兼容被忽略了。这个物体仍然像鸭子一样走路和像鸭子一样嘎嘎叫。


推荐阅读