可以将带有附加字段的对象压入类型化数组



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

Type '{fieldOne: string;fieldTwo:数量;fieldThree:字符串;}'不能赋值给类型'MyType'。对象字面值只能指定已知的属性,并且'fieldThree'在类型'MyType'中不存在。(2322)

但是,下面的泛型、无类型对象的情况不会抛出错误,并允许我将data压入数组:

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

假设最后一种情况也应该抛出错误,我错了吗?我遗漏了什么?

谢谢!

这在关于多余属性检查的文档中有解释。请花点时间读一读,因为它会让你了解这里正在发生的事情。

特别要注意这一节:

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

这解释了你所看到的差异。在这一点上,(松散的)结构类型兼容性是最重要的,而由于过量属性导致的不兼容性将被忽略。这个物体走路像鸭子,叫得像鸭子。

最新更新