基于继承的Typescript泛型类型推断

问题描述 投票:0回答:1

考虑此代码:

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 type-inference
1个回答
1
投票

我可以找到自己的答案,我不得不说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>());
© www.soinside.com 2019 - 2024. All rights reserved.