用于获取特定类型的字段名称的类型

时间:2019-04-05 07:32:19

标签: typescript

是否存在或有办法使用这种东西:

type X<Obj, FieldType> = ???;

interface A {
  a: number;
  b: number;
  c: string;
  d: Date;
}

type Nums = X<A, number>;    // == 'a' | 'b'
type Strings = X<A, string>; // == 'c'
type Dates = X<A, Date>;     // == 'd'

其中X是我要寻找的通用类型(keyof Obj的子集,在这种情况下为keyof A)。

1 个答案:

答案 0 :(得分:1)

您可以使用条件类型来过滤所需类型的属性:

type X<Obj, FieldType> = {
    [P in keyof Obj]-?: Obj[P] extends FieldType ? P : never
}[keyof Obj];

interface A {
    a: number;
    b: number;
    c: string;
    d: Date;
}

type Nums = X<A, number>;    // == 'a' | 'b'
type Strings = X<A, string>; // == 'c'
type Dates = X<A, Date>;     // == 'd'

您可以查看我对此here的解释