You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:05:24