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

