我在流程方面遇到了一个奇怪的错误。
我只是想有一个函数来接受带有一个对象的数组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(使用前将#替换为@)