You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:12:17