Извлечь универсальный тип, не возвращающий тип ввода - PullRequest
1 голос
/ 14 июня 2019

Учитывая этот пример кода:

type keys = {
    a: number
    b: string
}

class Model<T extends number, U extends string> { }

class ExtendedModel<T extends keys & {
    c: boolean
}> extends Model<T['a'], T['b']> {
   // private Keys: T // <---- try to uncomment this line
}

type ExtractExtendedModelT<ExtendedExtendedModel> = ExtendedExtendedModel extends ExtendedModel<infer U> ? U : never

class Test extends ExtendedModel<{
    a: 1
    b: '2'
    c: false
}> { }

type TestGenericType = ExtractExtendedModelT<Test>  // <---- and see the type difference

Почему я не могу получить введенный универсальный тип класса Test, который должен быть { a: 1, b: '2', c: false } ТОЛЬКО ЕСЛИ я опускаю приватныйпеременная на ExtendedModel?Хотя, если я зарегистрирую переменную, я могу правильно извлечь тип?

Проблема в том, что я не хочу добавлять какие-либо неиспользуемые переменные в свой класс.Может кто-нибудь помочь мне понять, почему это происходит, и помочь мне обойти это?

Ссылка на игровую площадку TS

1 Ответ

2 голосов
/ 14 июня 2019

Вы должны

TypeScript может вывести тип T, только если есть члены, использующие T.

У TypeScript есть FAQзапись об этом:

При выводе типа T в вызове функции мы пытаемся найти членов типа T в аргументе x, чтобы выяснить, каким должен быть T.Поскольку нет членов, которые используют T, нечего делать вывод, поэтому мы возвращаем {}.

...