【发布时间】:2020-09-15 02:54:37
【问题描述】:
我对 TypeScript 还很陌生,所以我正在升级我的旧项目以使用它。
但是,我不确定在对某些数据调用 Object.entries 时如何保留正确的类型。
举个例子:
Level.tsx:
const UnpassableTileComponents = useMemo(() =>
Object.entries(levelData[`level_${gameLevel}`].tiles.unpassable_tiles).map(([tileType, tiles]) => (
tiles.map(([leftPos, topPos], index) => (
<UnpassableTile
key={`${tileType}_${index}`}
leftPos={leftPos * 40}
topPos={topPos * 40}
tileType={tileType}
/>
))
)
).flat(), [gameLevel])
levelData.tsx:
import levelJSON from "./levelJSON.json";
interface ILevelJSON {
[key: string]: Level;
}
interface Level {
tiles: Tiles;
}
interface Tiles {
unpassable_tiles: UnpassableTiles;
}
interface UnpassableTiles {
rock: Array<number[]>;
tree: Array<number[]>;
}
export default levelJSON as ILevelJSON;
levelJSON.json:
{
"level_1": {
"tiles": {
"unpassable_tiles": {
"rock": [[0, 0]],
"tree": [[2, 0]]
}
}
},
"level_2": {
"tiles": {
"unpassable_tiles": {
"rock": [[]],
"tree": [[]]
}
}
}
}
在上述情况下,tiles 表示一个数组 Array,每个数组有两个数字。 因此,[leftPos, topPos] 都应该输入为数字。但是,在 Level.tsx 中,它们具有任何属性。我可以通过以下方式获得我想要的结果:
const UnpassableTileComponents = useMemo(() =>
Object.entries(levelData[`level_${gameLevel}`].tiles.unpassable_tiles).map(([tileType, tiles]) => (
tiles.map(([leftPos, topPos] : number[], index: number) => (
<UnpassableTile
key={`${tileType}_${index}`}
leftPos={leftPos * 40}
topPos={topPos * 40}
tileType={tileType}
/>
))
但无论如何不应该推断 number[] 吗?
任何建议将不胜感激。
【问题讨论】:
-
欢迎来到 Stack Overflow!请考虑修改上述代码以构成minimal reproducible example 中提到的How to Ask。理想情况下,可以将某些东西放入像The TypeScript Playground 这样的独立 IDE 中,并允许想要帮助的人自己演示您的问题。祝你好运!
-
@jcalz 按要求添加:)
标签: javascript reactjs typescript