获取按对象值类型过滤的对象键的并集类型

时间:2019-11-07 13:27:15

标签: typescript

有没有一种方法可以获取按对象值类型过滤的对象键的并集类型?

我认为,条件类型中的类型推断适用于此,因此我在下面进行了尝试。 ({KeyOfValueType是我想要的)

type Obj1 = { a: string, b: number };
type Obj2 = { c: number, d: string, e: string };

type KeyOfValueType<
    Obj extends {},
    ValueType extends Obj[keyof Obj]
> = ValueType extends Obj[infer K] ? K : never;

type Result1 = KeyOfValueType<Obj1, number>; // "b" because Obj1["b"] is equal to number
type Result2 = KeyOfValueType<Obj2, string>; // "d" | "e" because Obj2["d"] and Obj2["e"] are equals to string;

TypeScript Playground

但是tt在Type 'K' cannot be used to index type 'Obj'.处引发了一个错误Obj[infer K]

1 个答案:

答案 0 :(得分:1)

有软件包https://github.com/piotrwitek/utility-types。 它具有PickByValuePickByValueExact运算符(以及许多其他有用的类型运算符)。您可以将它们与keyof一起使用以实现您的目标。他们确实为此使用了条件类型和infer

type PickByValue<T, ValueType> = Pick<T, {
    [Key in keyof T]: T[Key] extends ValueType ? Key : never;
}[keyof T]>;

type R1 = keyof PickByValue<Obj1, number> //b
type R2 = keyof PickByValue<Obj2, string> //d | e