如何在TypeScript中定义未知属性名类型并转换JSON为数组
解决思路
要实现从给定的JSON结构到目标数组类型的转换,需要分类型定义和运行时数据转换两部分处理:
1. 定义原始数据的类型
首先需要描述输入JSON的结构,用Record工具类型来定义MeasureList的键值对结构:
// 你已定义的子项类型 type MeasureListItem = { Description: string Value: string } // 原始MeasureList的类型:任意字符串键对应MeasureListItem type MeasureList = Record<string, MeasureListItem> // 完整原始JSON的类型 type RawData = { MeasureList: MeasureList }
2. 目标Result类型的定义
你给出的Result类型已经符合需求,若要从原始类型推导,也可以这样写(效果完全等价):
type Result = { measures: Array<RawData['MeasureList'][keyof RawData['MeasureList']]> }
这里利用keyof提取MeasureList的所有键,再通过索引访问得到值类型MeasureListItem,最终组成数组。
3. 运行时数据转换
TypeScript仅负责编译时类型检查,需要编写函数将对象转换为数组,核心用Object.values提取对象的所有值:
function transformRawData(rawData: RawData): Result { return { measures: Object.values(rawData.MeasureList) } }
可选:保留原始标识(如M17、M300)
如果需要保留每个子项的原始键作为标识,可以扩展类型并调整转换逻辑:
type MeasureListItemWithId = MeasureListItem & { id: string } type ResultWithId = { measures: MeasureListItemWithId[] } function transformWithId(rawData: RawData): ResultWithId { return { measures: Object.entries(rawData.MeasureList).map(([id, item]) => ({ id, ...item })) } }
内容的提问来源于stack exchange,提问作者Darko Romanov
相关产品推荐
相关产品推荐

