如何在Object.entries()中使用TypeScript?

zpjtge22  于 2022-12-24  发布在  TypeScript
关注(0)|答案(4)|浏览(336)

我最近开始在我自己的项目中使用TypeScript,尽管我不确定应该如何让我的代码工作。

Object.entries(data[`set_${id}`].tiles).map(([tileType, tiles]) => (
  tiles.map(([left, top]), index) => (
     //rest of code
  )
))

TypeScript抱怨left、top和index都具有“any”类型。如何在此配置中分配类型?
结构:

{
  "set_1": {
    "tiles": {
       "typeA": [[0, 1], [0, 2]],
       "typeB": [[2, 0], [2, 1]]
    }
  }
}

任何建议都将不胜感激。
谢谢!

nhn9ugyo

nhn9ugyo1#

解决了。通过以下方式实现:

Object.entries(data[`set_${id}`].tiles).map(([tileType, tiles]) => (
  tiles.map(([left, top] : number[], index : number) => (
     //rest of code
  )
))
umuewwlo

umuewwlo2#

我能够让它快速工作,通过重复的类型:

for (const [k, v] of (Object.entries(o) as [number, any][]))
// typeof(k) === 'number'
// typeof(v) === 'any'

但是有时候必须先强制转换为unknown

for (const [k, v] of (Object.entries(o) as unknown as [number, any][]))

您也可以将其 Package 成一个实用程序函数:

function objectEntries<K extends (string | number | symbol), V>(o: Record<K, V>) {
  return Object.entries(o) as unknown as [K, V][];
}

for (const [k, v] of objectEntries(o))
// typeof(k) matches key type of 'o'
// typeof(v) matches value type of 'o'

编辑:in this answer解释了为什么这不是自动完成的。

o7jaxewo

o7jaxewo3#

这是最适合我的方法:

export function typeSafeObjectEntries<
  T extends { [key: string | number | symbol]: any },
  K extends keyof T,
  V extends T[K]
>(o: T) {
  return Object.entries(o) as unknown as [K, V][];
}
mctunoxg

mctunoxg4#

您可以按以下方式设置它们:

Object.entries(data[`set_${id}`].tiles).map(([tileType, tiles]) => (
  tiles.map(([left: number, top: number]), index: number) => (
     //rest of code
  )
))

相关问题