Object.entries属性“ length”的类型丢失

时间:2019-12-06 19:07:31

标签: typescript typescript2.0

使用我的代码

for (const [teamName, teamData] of Object.entries<TeamsData>(data)) {
  ...
}

我遇到错误

Argument of type 'TeamsData' is not assignable to parameter of type '{ [s: string]: TeamsData; } | ArrayLike<TeamsData>'.

Property 'length' is missing in type 'TeamsData' but required in type 'ArrayLike<TeamsData>'.

我的TeamsData类型是

export interface TeamsData {
  [key: string]: TeamDataStructure;
}

看看Object.entries的界面,

entries<T>(o: { [s: string]: T } | ArrayLike<T>): [string, T][];

所以我觉得它应该与{ [s: string]: TeamsData; }相匹配,但事实并非如此。相反,它看起来像与ArrayLike<T>匹配,导致它需要length。我可以使用any作为类型,并且错误消失了,但是我想知道如何在TypeScript中正确使用Object.entries

1 个答案:

答案 0 :(得分:0)

我不确定为什么它不起作用,但是问题似乎出在您的泛型类型被显式传递。

只要将data的类型严格设置为TeamsData,就可以让编译器为您推断T

interface TeamsData {
  [key: string]: number;
}
const data: TeamsData = { a:1, b:2 }
for (const [teamName, teamData] of Object.entries(data)) {
  //...
}