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

TypeScript:从参数函数推断泛型参数的问题

TypeScript泛型适配器消费函数的类型推断问题

我有一批遵循统一格式的查询适配器,示例如下:

// 一种查询适配器类型
type O1 = { opt: 1 }
const adapter1 = (key: string, options?: O1) => 1
// 第二种查询适配器类型
type O2 = { opt: 2 }
const adapter2 = (key: string, options?: O2) => 2
// 理论上可以有任意类型的查询适配器,但都遵循此通用格式

所有适配器的参数格式统一为[string, options?: unknown (泛型)],且适配器的数量理论上是无限的,因此消费这些适配器的函数需要支持泛型参数。

我定义了以下适配器消费函数:

// 适配器的类型定义工具
type Fn = <O, R>(key: string, options?: O) => R

// 接受适配器及其可选配置的消费函数
const query = <F extends Fn, O extends Parameters<F>[1]>(
  key: string,
  adapter: F,
  options?: O
): ReturnType<F> => adapter(key, options)

我期望TypeScript能根据传入的参数自动推断options的类型,但实际所有调用都抛出了类型不匹配的TS错误。

预期的调用行为

  • 以下调用应该通过(省略可选配置):
    query('1', adapter1)
    query('2', adapter2)
    
  • 以下调用也应该通过(传入正确配置):
    query('1config', adapter1, { opt: 1 })
    query('2config', adapter2, { opt: 2 })
    
  • 以下调用应该因配置类型不匹配报错:
    query('1error', adapter1, { foo: 'bar' })
    query('2error', adapter2, { foo: 'bar' })
    

实际错误信息

所有调用都会抛出如下TS错误:

Argument of type '(key: string, options?: O1) => number' is not assignable to parameter of type 'Fn'.
  Types of parameters 'options' and 'options' are incompatible.
    Type 'O | undefined' is not assignable to type 'O1 | undefined'.
      Type 'O' is not assignable to type 'O1 | undefined'.

临时修复的局限性

在这个示例中,把O extends Parameters<F>[1]改为O extends O1 | O2 | undefined可以修复问题,但适配器的配置类型理论上有无限种,我需要消费函数能够自动推断配置对象的类型,确保调用时的类型安全。

实际场景涉及更复杂的回调逻辑,但此示例已能复现核心问题。请勿评论直接使用(key, options) => adapter(key, options)的合理性,这不在问题讨论范围内。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:55:15