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

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[] }>();

关键改动说明

  1. 泛型参数简化

    • 将recursive的泛型参数从U, T合并为单个T,通过U = T[keyof T][number]自动推断出数组元素的类型。调用时只需传入{ inventory: Inventory[] }这类对象类型,无需重复指定Inventory或User。
  2. 动态键处理

    • 使用Object.entries()获取返回对象的键值对,结合运行时检查确保对象只有一个键,避免多键场景导致逻辑错误。
    • 通过类型断言[keyof T, U[]]保证键和数组的类型与泛型T匹配,避免类型报错。
  3. inner函数适配

    • 调整inner的泛型为T extends Record<string, unknown[]>,直接接收目标对象类型,无需单独指定元素类型,保持与recursive的泛型一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 05:25:08