【发布时间】:2022-07-05 22:36:44
【问题描述】:
我有一个超级简单的用例。我想要一个函数pluckOnlyStringValues,在该函数上传递一个对象obj 和一个key,我想确保我只能传递值为string 的键。这样pluckOnlyStringValues 总是返回string。
为了这个目标,我正在尝试实现一个类型帮助器 PickKeysByValue,但它似乎不起作用......
type PickKeysByValue<T extends object, ValueTypes> = {
[K in keyof T]-?: T[K] extends ValueTypes ? K : never;
}[keyof T];
// Working
type GetKeysWithStringValues = PickKeysByValue<
{ a: string; b?: string; c: number | undefined; d: () => 4 },
string
>;
// Working
type GetStringValues = { a: string; b?: string; c: number | undefined; d: () => 4 }[GetKeysWithStringValues]
// Not working
const pluckOnlyStringValues = <O extends { a: string }>(
obj: O,
key: PickKeysByValue<O, string>,
): string => {
return obj[key];
};
【问题讨论】:
-
为什么要将
O限制为{ a: string }?您应该将其替换为Record<string, any>或Record<string, any> & { a: string },以表明obj可以使用string进行索引。
标签: typescript typescript-generics typescript-utility