【问题标题】:Parameter Generic Inference With keyof使用 keyof 的参数泛型推理
【发布时间】:2019-10-06 05:29:39
【问题描述】:

我正在尝试使用函数参数来推断另一个函数参数的缩小泛型类型的键。如果我硬编码一个类类型来代替泛型,一切似乎都可以工作;但是,当使用通用值时,第二个参数的缩小不起作用。已经在这几天了,我迷路了。

困惑?我知道我是......这是说明问题的代码。在最后一个函数中,第二个参数应解析为有效属性。

class A {
    readonly shortname = 'A';
    id: number;
    genStart: Date;
}

class B {
    readonly shortname = 'B';
    id: number;
    genPart: Date;
}


class C {
    readonly shortname = 'C';
    id: number;
    genEnd: Date;
}

type Entities = A | B | C;

type GetEtType<T extends Entities['shortname']>
    =  keyof Extract<Entities, { shortname: T }>;

class EtTester {
    tester<TShortName extends Entities['shortname'],
        TProp extends GetEtType<TShortName>>(shortName: TShortName,
        propName: TProp) {

    }
}

let et = new EtTester();

et.tester('B', 'genPart' )

任何帮助都会很棒。

Playground

【问题讨论】:

    标签: typescript generics discriminated-union


    【解决方案1】:

    如果我正确理解了这个问题,GetEtType&lt;T&gt; 应该返回由其泛型类型参数 T 选择的实体类型的键,该参数必须是每个实体中定义的 shortname 值之一。

    keyof Extract&lt;...&gt; 不起作用,似乎keyof 在解析为never 时在条件类型评估中的某个时间被急切地应用。

    this answer 之后,它讲述了如何根据判别属性的类型来选择判别联合类型的成员,这里是GetEtType 的定义,它在这里工作:

    type GetEtType<T extends Entities['shortname']>
        = Entities extends (infer E)? 
            E extends Entities?
                E['shortname'] extends T ? keyof E : never : never : never
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多