使用枚举索引对象

时间:2020-07-30 11:40:42

标签: javascript json typescript

我具有以下结构;

import data from "../data.min.json";

export enum TileType {
  tree = 'tree',
  rock = 'rock'
}

interface MapTile {
  walkable: boolean;
  positions: number[][];
}

export type MapTiles =  {
  [key in TileType]: MapTile
}

export interface Level1 {
  mapTiles: MapTiles;
}

export interface RootObject {
  level_1: Level1;
}

export default data as RootObject;

这很好。但是,当我尝试像这样使用它时;

const entries = Object.entries(data.level_1.mapTiles);
entries.forEach(([tileType, data]) => {
  
})

tileType的值是一个字符串,而不是一个Enum。我该如何获取枚举值呢?

数据结构:

{
  "level_1": {
    "mapTiles": {
      "tree": {
        "walkable": false,
        "positions": [
          [ 0, 0 ], [ 0, 40 ], [ 0, 80 ]]
      },
      "rock": {
        "walkable": false,
        "positions": [
          [2, 4], [5, 7]
        ]
      },
    }
  }
}

1 个答案:

答案 0 :(得分:0)

这与Object.entrieslib.esXXX.object.d.ts的键入有关。 In lib.es2017.object.d.ts for example,键入如下:

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

如您所见,key被假定为字符串。如果您改为这样更改,则一切都会按预期进行:

entries<T, U extends keyof T>(o: T): [U, T[U]][];

现在您显然不想更新标准库中的类型-因此您可以像这样创建自己的类型化函数:

const objectEntries = <T, U extends keyof T>(inputObject: T) => {
  return Object.entries(inputObject) as [U, T[U]][]
}

使用此方法,您应该得到想要的输入,并且

objectEntries(data.level_1.mapTiles).forEach(([
  tileType, // correctly inferred as "tree" | "rock"
  data
]) => {})

enter image description here

相关问题