对象类型的 Flowtype 数组不允许额外的属性

2023-12-20

我在流程方面遇到了一个奇怪的错误。 我只是想有一个函数来接受带有一个对象的数组amount属性,但在提供具有更多属性的对象时出现错误。

const sum = (items: Array<{amount: number}>) => {/* something */}

type Item = {
  amount: number,
  name: string
};

const list: Array<Item> = [];

sum(list);

这给了我以下错误:

10: const list: Array<Item> = [];
                      ^ property `name`. Property not found in
2: const sum = (items: Array<{amount: number}>) => {/* something */}
                             ^ object type

https://flow.org/try/#0FAYw9gdgzgLgBFArgWzgXjgCgJYwKbJQBccAggE7kCGAngDwDeVyYiEMJEKARnuQL4A+AJTpBcBgHoAVAjDI8MABbYIAczjTJ-YLpg0ADnjgBJfKgwNgcom1btOPPgBprcCMzwlY5V WuD8Any64NDwADbYsCQU1PRmBOIYANOAusHASMiYkbDCGUA https://flow.org/try/#0FAYw9gdgzgLgBFArgWzgXjgCgJYwKbJQBccAggE7kCGAngDwDeVyYiEMJEKARnuQL4A+AJTpBcBgHoAVAjDI8MABbYIAczjTJ-YLpg0ADnjgBJfKgwNgcOM1btOPPgBprcCMzwlY5VWuD8ANy64NDwADbYsCQU1PRmBOIYANoAusHASMiYkbDCgUA


与此处描述的问题类似:https://github.com/facebook/flow/issues/1644 https://github.com/facebook/flow/issues/1644

这是不允许的,因为你的声明,

const sum = (items: Array<{amount: number}>) => {/* something */}

会允许

const sum = (items: Array<{amount: number}>) => {
    items.push({amount: 4});
};

鉴于以下声明,这是完全有效的items。数组传递给sum是您的列表Item类型,这需要一个name,这里没有设置。

正如你提到的,$ReadOnlyArray有效,因为它是只读的,不能添加更多项目。或者,您可以从以下位置删除类型定义sum完全并让 Flow 推断它们,或者改变Array<{amount: number}> to Array<*>所以 Flow 知道它是一个数组,但会推断内容的类型。另一种选择(您在评论中留下的)是

const sum = <T : {amount: number}>(items: Array<T>) => {/* something */}

这将设置T to Item根据您的电话sum(list),其限制是它将接受任何T这是一个带有数字的对象amount财产。

这可能是最好的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对象类型的 Flowtype 数组不允许额外的属性 的相关文章

随机推荐