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
相关产品推荐
相关产品推荐

