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

如何通过TypeScript泛型从K类型提取L类型属性并生成数组

完善泛型属性提取函数

先给出修正并完善后的完整代码:

interface UserDetails {
  name: string;
  age: number;
}

interface Json {
  name: string;
  age: number;
  address: string;
}

export function createListItems<K, L extends Record<keyof L, unknown>>(jsonData: K[]): L[] {
  const items: L[] = [];
  // 获取目标类型L的所有属性键
  const targetKeys = Object.keys({} as L) as Array<keyof L>;

  for (const data of jsonData) {
    const obj: Partial<L> = {};
    // 遍历目标属性,从源数据中提取对应值
    for (const key of targetKeys) {
      if (key in data) {
        obj[key] = data[key] as L[keyof L];
      }
    }
    items.push(obj as L);
  }

  return items;
}

// 修正调用语法,使用标准数组字面量
const result = createListItems<Json, UserDetails>([
  { name: "sunny", age: 20, address: "pune" },
  { name: "minnu", age: 20, address: "pune" }
]);

如果想更简洁,也可以用map和Object.fromEntries实现:

export function createListItems<K, L extends Record<keyof L, unknown>>(jsonData: K[]): L[] {
  const targetKeys = Object.keys({} as L) as Array<keyof L>;
  
  return jsonData.map(data => {
    return Object.fromEntries(
      targetKeys.filter(key => key in data).map(key => [key, data[key]])
    ) as L;
  });
}

关键说明

  • 泛型约束优化:给L加extends Record<keyof L, unknown>约束,确保它是拥有明确属性的对象类型,后续能安全遍历其属性键。
  • 属性提取逻辑:先拿到目标类型L的所有属性名,再遍历每个源数据对象,只提取这些属性对应的值,组装成符合L类型的对象。
  • 类型安全处理:用类型断言把临时对象转为L类型,同时检查属性是否存在,避免运行时访问不存在的属性报错。
  • 调用语法修正:原调用的数组写法不符合规范,改成标准的数组包裹对象格式,TypeScript才能正确识别输入类型。

内容的提问来源于stack exchange,提问作者Makaraju Bhanu prathyusha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:10:31