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

TypeScript高阶函数类型推断异常:泛型Handler类型丢失

TypeScript泛型Handler在Provider类中的类型推断问题

我正在实现一个Provider类,用来存储handler函数,并能结合指定上下文执行:

interface ProviderHandler<A extends any[] = any[], R = any> {
  (this: RequestContext, ...args: A): R
}

type FlatPromise<T> = Promise<T extends Promise<infer E> ? E : T>

interface WrapCall {
  <T extends ProviderHandler>(provider: Provider<T>): T extends ProviderHandler<
    infer A,
    infer R
  >
    ? (...args: A) => FlatPromise<R>
    : never
}

interface RequestContext {
  /* ... */
  call: WrapCall
}

class Provider<T extends ProviderHandler = ProviderHandler> {
  handler: T

  constructor(options: { handler: T }) {
    this.handler = options.handler
  }
}

const context = { /* 假设已实现 */ } as RequestContext

当handler是普通函数时,类型推断工作正常:

const p1 = new Provider({
    async handler() {
        return 5
    }
})

// r1 类型为 number
const r1 = await context.call(p1)()

但使用泛型handler函数时,类型推断失效:调用context.call(p2)('text')后,返回值r2的实际类型是unknown,而非预期的string:

const p2 = new Provider({
    async handler<T>(t: T) {
        return t
    }
})

// 实际类型: r2 = unknown
// 预期类型: r2 = string
const r2 = await context.call(p2)('text')

相关TypeScript议题:

  • TypeScript PR #30215
  • TypeScript Issue #30134

内容的提问来源于stack exchange,提问作者Meowster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:35:21