代码之家  ›  专栏  ›  技术社区  ›  roomcayz

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

  •  2
  • roomcayz  · 技术社区  · 7 年前

    我想要一个类型,它允许我只从值扩展给定类型的对象中选择那些属性,例如:

    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}
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   jcalz    7 年前

    我可能会这样执行:

    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>;
    // }
    

    假设这是你想看到的,那就行了。希望有帮助,祝你好运!

    推荐文章