考虑此代码:
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
])。
为什么打字稿不这样做?它是缺少的功能,不合理的推论,还是有其他方法可以实现所需的行为?
我可以找到自己的答案,我不得不说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>());