如何用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
相关产品推荐
相关产品推荐

