Рассмотрим этот код:
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
).
Почему машинопись не делает этого? Это отсутствующая функция, незвуковый вывод или есть другой способ добиться желаемого поведения?