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

