TypeScript泛型:运行时动态JSON键与泛型调用简化问题
解决方案
修正后的完整代码
// 调整inner函数的泛型,直接接收目标对象类型T const inner = async <T extends Record<string, unknown[]>>(): Promise<T> => { // 模拟异步逻辑,实际返回符合T结构的数据 return {} as T; }; // 简化泛型参数,自动推断元素类型U const recursive = async <T extends Record<string, U[]>, U = T[keyof T][number]>() => { let count = 10; const arr: U[] = []; while (count > 0) { const result = await inner<T>(); // 确保返回结果只有一个键(可选的运行时检查) const entries = Object.entries(result); if (entries.length !== 1) { throw new Error("异步返回结果必须包含且仅包含一个键"); } // 动态获取键和对应的数组 const [, items] = entries[0] as [keyof T, U[]]; arr.push(...items); count--; } return arr; }; // 原有类型定义不变 interface Inventory { id: number; name: string; } interface User { id: string; age: string; } // 简化后的调用方式 recursive<{ inventory: Inventory[] }>(); recursive<{ users: User[] }>();
关键改动说明
泛型参数简化
- 将
recursive的泛型参数从U, T合并为单个T,通过U = T[keyof T][number]自动推断出数组元素的类型。调用时只需传入{ inventory: Inventory[] }这类对象类型,无需重复指定Inventory或User。
- 将
动态键处理
- 使用
Object.entries()获取返回对象的键值对,结合运行时检查确保对象只有一个键,避免多键场景导致逻辑错误。 - 通过类型断言
[keyof T, U[]]保证键和数组的类型与泛型T匹配,避免类型报错。
- 使用
inner函数适配
- 调整
inner的泛型为T extends Record<string, unknown[]>,直接接收目标对象类型,无需单独指定元素类型,保持与recursive的泛型一致性。
- 调整
内容的提问来源于stack exchange,提问作者trixobird
相关产品推荐
相关产品推荐

