我具有以下结构;
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]
]
},
}
}
}
答案 0 :(得分:0)
这与Object.entries
中lib.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
]) => {})