Typescript generi c вывод типа на основе наследования - PullRequest
0 голосов
/ 22 марта 2020

Рассмотрим этот код:

class A<T> { t?: T; }
interface B {}
class C implements A<B> {}
function f<T1 extends A<T2>, T2>(a: T1): T2 | undefined { return a.t; }

const result = f(new C());
const result2 = f(new A<B>());

Оказывается, что тип result или даже result2 будет unknown, в то время как он может быть выведен из контекста, как C реализует A<B> (поэтому его можно вывести как B).

Почему машинопись не делает этого? Это отсутствующая функция, незвуковый вывод или есть другой способ добиться желаемого поведения?

1 Ответ

1 голос
/ 22 марта 2020

Я мог бы найти свой собственный ответ, и я должен сказать, что TypeScript безупречен!

class A<T> { t?: T; }
interface B {}
class C extends A<B> {}

type ExtractGeneric<T> = T extends A<infer X> ? X : never;
function f<T1 extends A<T2>, T2 = ExtractGeneric<T1>>(a: T1): T2 | undefined { return a.t; }

const result = f(new C());
const result2 = f(new A<B>());
...