【问题标题】:Type for getting names of fields of specific type [duplicate]用于获取特定类型字段名称的类型 [重复]
【发布时间】:2019-08-27 01:27:29
【问题描述】:

确实存在,或者有办法使用这样的东西:

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)。

【问题讨论】:

    标签: typescript


    【解决方案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的解释

    【讨论】:

    • 虽然我的问题是重复的(我没有找到另一个问题),但答案似乎有所不同。即-?。谢谢回复,我周一去试试。我记得我看到了类似的解决方案并尝试了它,但它产生的类型不知何故被破坏了。哦,我可能会将它与按类型过滤字段混淆,其中具有严格 TS 设置的结果类型无法构造(或者至少看起来是这样 - 编译器抱怨缺少 never 类型的字段)。
    猜你喜欢
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    相关资源
    最近更新 更多