我希望有一个类型,该类型允许我仅从值扩展给定类型的对象中选择那些属性,例如:
type PickOfValue<T, V extends T[keyof T]> = {
[P in keyof (key-picking magic?)]: T[P];
};
所以我需要选择T
的键(属性),其值是V
的类型(条件T[P] extends V
是true
),我找不到解决这个问题的任何方法,这是我最后的帮助手段。
示例结果:
PickOfValue<Response, () => Promise<any>>; // {json: () => Promise<any>, formData: () => Promise<FormData>, ...}
PickOfValue<{a: string | number, b: string, c: number, d: "", e: 0}, string | number>; // {a: string | number, b: string, c: number, d: "", e: 0}
答案 0 :(得分:3)
我可能会这样实现:
type KeysOfValue<T, V extends T[keyof T]> =
{ [K in keyof T]-?: T[K] extends V ? K : never }[keyof T];
type PickOfValue<T, V extends T[keyof T]> = Pick<T, KeysOfValue<T, V>>
KeysOfValue
类型的函数使用mapped,conditional类型来拉出相关的键。
对于您的示例,将产生以下结果:
type Example = PickOfValue<Response, () => Promise<any>>;
// type Example = {
// arrayBuffer: () => Promise<ArrayBuffer>;
// blob: () => Promise<Blob>;
// formData: () => Promise<FormData>;
// json: () => Promise<any>;
// text: () => Promise<string>;
// }
假设这就是您要查看的内容,那么它就可以工作。希望能有所帮助;祝你好运!