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

如何为键名动态变化的JSON编写对应的TypeScript接口定义?

动态键JSON的TypeScript类型定义方案

完全可以实现,TypeScript提供了索引签名、Record工具类型等能力专门处理这类键名不固定的场景,具体实现步骤如下:

第一步:定义固定结构的子类型

你给出的JSON中,所有动态键对应的取值结构是完全一致的,先把这部分公共结构抽出来定义:

// 定义选项条目类型
interface FilterOption {
  label: string;
  value: string;
}

// 定义过滤器配置的统一结构
interface FilterConfig {
  label: string;
  options: FilterOption[];
}

第二步:定义带动态键的外层类型

根据你的实际场景选对应写法即可:

  • 场景1:键名是任意字符串,没有固定规则
    可以用索引签名或者更简洁的Record工具类型:
    // 写法1:索引签名
    interface FilterMap {
      [key: string]: FilterConfig
    }
    
    // 写法2:Record工具类型(更推荐)
    type FilterMap = Record<string, FilterConfig>
    
  • 场景2:键名有固定命名规则,比如必须以Filter为后缀
    可以结合模板字面量类型做更严格的约束:
    type FilterMap = Record<`${string}Filter`, FilterConfig>
    
  • 场景3:提前知道所有可能的键名取值
    可以把允许的键名定义为联合类型,进一步提升类型安全性:
    // 仅允许userFilter、activityFilter两个键
    type AllowedFilterKeys = 'userFilter' | 'activityFilter'
    type FilterMap = Record<AllowedFilterKeys, FilterConfig>
    

验证示例

把你给出的JSON赋值给上述FilterMap类型的变量,TypeScript会完全兼容,不会报错:

const myFilters: FilterMap = {
  "userFilter": {
    "label": "Users",
    "options": [
      { "label": "Admin", "value": "ADMIN" },
      { "label": "Viewer", "value": "VIEWER" }
    ]
  },
  "activityFilter": {
    "label": "Activity",
    "options": [
      { "label": "Active", "value": "ACTIVE" },
      { "label": "Inactive", "value": "INACTIVE" }
    ]
  }
}

内容的提问来源于stack exchange,提问作者Adrian E

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:12:07