TypeScript泛型类类型推断问题:如何正确推导foo函数的泛型参数?
解决TypeScript泛型参数推断过宽的问题
问题出在Foo类的泛型参数F没有在类的结构中留下可被TypeScript追踪的痕迹——因为你的Foo是抽象类且没有任何依赖F的成员,TypeScript无法从Bar的实例反向推导出具体的F类型,只能退而求其次使用最宽泛的约束AnyFunction。
下面是两种可行的解决方法,都能保持你原有的调用方式:
方法一:添加类型标记属性
给Foo类添加一个仅用于类型追踪的属性(不会影响运行时),让TypeScript能从实例中提取出具体的F类型:
type AnyFunction = (...args: any[]) => any; abstract class Foo<F extends AnyFunction> { // 仅作为类型标记,运行时可以忽略 readonly __functionType?: F; } class Bar extends Foo<() => string> {} function foo<F extends AnyFunction>(foo: Foo<F>): void {} foo(new Bar()); // 现在F会正确推断为 () => string
方法二:让类成员依赖泛型参数
如果你的业务逻辑允许,可以给Foo添加一个依赖F的抽象成员,比如一个方法或者属性,这样TypeScript自然能通过成员类型推断出F:
type AnyFunction = (...args: any[]) => any; abstract class Foo<F extends AnyFunction> { abstract execute: F; } class Bar extends Foo<() => string> { execute = () => "example string"; } function foo<F extends AnyFunction>(foo: Foo<F>): void {} foo(new Bar()); // F推断为 () => string
这两种方法的核心都是让Foo的类型结构与泛型参数F建立关联,让TypeScript有足够的信息完成精确推断。
内容的提问来源于stack exchange,提问作者Lehks
相关产品推荐
相关产品推荐

