选择具有给定类型值的属性

时间:2018-12-18 14:27:44

标签: typescript

我希望有一个类型,该类型允许我仅从值扩展给定类型的对象中选择那些属性,例如:

type PickOfValue<T, V extends T[keyof T]> = {
    [P in keyof (key-picking magic?)]: T[P];
};

所以我需要选择T的键(属性),其值是V的类型(条件T[P] extends Vtrue),我找不到解决这个问题的任何方法,这是我最后的帮助手段。

示例结果:

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}

1 个答案:

答案 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类型的函数使用mappedconditional类型来拉出相关的键。

对于您的示例,将产生以下结果:

type Example = PickOfValue<Response, () => Promise<any>>; 
// type Example = {
//  arrayBuffer: () => Promise<ArrayBuffer>;
//  blob: () => Promise<Blob>;
//  formData: () => Promise<FormData>;
//  json: () => Promise<any>;
//  text: () => Promise<string>;
// }

假设这就是您要查看的内容,那么它就可以工作。希望能有所帮助;祝你好运!