Общий вывод параметра с помощью keyof - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь использовать параметр функции, чтобы вывести ключ суженного универсального типа другого параметра функции. Если я жестко закодирую тип класса вместо универсального, все, кажется, работает; однако при использовании универсального значения сужение второго параметра не работает. Я был в течение нескольких дней, я в растерянности.

Confused? Я знаю, что я ... Вот код для иллюстрации проблемы. В последней функции второй параметр должен разрешаться как допустимое свойство.

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

Любая помощь будет отличной.

Детская площадка

1 Ответ

1 голос
/ 19 мая 2019

Если я правильно понимаю проблему, GetEtType<T> должен возвращать ключи типа сущности, выбранного его параметром универсального типа T, который должен быть одним из shortname значений, определенных в каждой сущности.

keyof Extract<...> не работает, кажется, что keyof применяется с готовностью в какое-то время при оценке условного типа, когда оно разрешается до never.

После этого ответа , который говорит, какчтобы выбрать член различимого типа объединения на основе типа свойства дискриминанта, вот определение для GetEtType, которое работает здесь:

type GetEtType<T extends Entities['shortname']>
    = Entities extends (infer E)? 
        E extends Entities?
            E['shortname'] extends T ? keyof E : never : never : never
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...