我的目标是创建一个名为: 的函数getFields
。这个函数有一个泛型<T>
和一个参数...fields: Array<keyof T>
。我希望这个函数返回一个函数,当给定一个类型的对象时,该函数<T>
将返回一个简化的对象,其中仅包含名为 in 的属性...fields
。
以下是一种辅助类型和我的getFields
实现:
type SubObj<T, S extends Array<keyof T>> = Pick<
T,
keyof { [K in S[number]]: K extends keyof T ? K : never }
>;
export function getFields<T extends Record<string, unknown>>(
...fields: Array<keyof T>
): (obj: T) => SubObj<T, typeof fields> {
return (obj: T) =>
Object.fromEntries(fields.map((field) => [field, obj[field]])) as SubObj<
T,
typeof fields
>;
}
我用以下代码测试了这个实现:
type A = {
a: string;
b: string;
c: string;
};
const b = getFields<A>('a', 'c')({ a: '', b: '', c: '' });
然而,当我看typeof
b
它时Pick<A, "a" | "b" | "c">
。我真正想要的是Pick<A, "a" | "c">
。
我已经尝试了很多方法来使这项工作按我的预期进行,但唯一的成功是添加了第二个通用参数,这需要我将代码更改为:
const b = getFields<A, ['a','c']>('a', 'c')({ a: '', b: '', c: '' });
这对我来说太多余了,无法接受。
在这一点上,我认为我已经达到了我的 TypeScript 能力的极限,因为我想不出任何其他方法来完成我正在寻找的东西。
这甚至可以用 TypeScript 做吗?如果是这样,我需要做什么?