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

如何用TypeScript定义含动态属性键的嵌套JSON数组类型?

解决方案:定义带动态属性的数组类型

首先,你需要先明确每个动态属性对应的值的结构,再基于这个结构定义数组元素的类型,完全可以不用any[]或宽泛的Object[]/object[]。

步骤1:定义值类型

先固定每个动态属性对应的值的结构(即包含array_A和array_B的对象),如果知道array_A和array_B的具体类型,把any[]替换成实际类型即可:

type ListContent = {
  array_A: any[];
  array_B: any[];
};

步骤2:定义数组元素类型

数组里的每个对象拥有任意字符串类型的动态属性名,属性值为上面定义的ListContent,用索引签名就能实现:

type DynamicListItem = { [key: string]: ListContent };

步骤3:用定义好的类型作为函数参数

现在整个数组的类型就是DynamicListItem[],可以直接用于函数参数:

function processDynamicArray(arr: DynamicListItem[]) {
  arr.forEach(item => {
    // 获取对象的唯一动态键(你保证每个对象只有一个键)
    const dynamicKey = Object.keys(item)[0];
    const content = item[dynamicKey];
    
    // TS会自动识别array_A和array_B的类型,不会报错
    content.array_A.forEach(item => { /* 处理逻辑 */ });
    content.array_B.forEach(item => { /* 处理逻辑 */ });
  });
}

可选:严格限制单键的场景

如果能提前枚举所有可能的动态键,还可以用泛型严格确保每个数组元素只有一个属性:

type SingleKeyDynamicItem<K extends string> = { [P in K]: ListContent };

// 示例:指定允许的键类型
const exampleArray: SingleKeyDynamicItem<'userList' | 'productList' | 'orderList'>[] = [
  { userList: { array_A: [], array_B: [] } },
  { productList: { array_A: [], array_B: [] } },
];

如果键完全不可预知,用前面的索引签名方案更灵活。

为什么Object[]/object[]会报错?

Object和object仅表示这是一个对象,但TS无法推断里面的具体属性结构,所以你访问array_A或array_B时,TS会提示属性不存在的错误。而我们定义的DynamicListItem明确了键值结构,TS能正确做类型检查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:31:02