TypeScript中调用Redux Saga的call函数出现Parameters类型不匹配问题
问题原因
TypeScript 的泛型约束 extends 仅限定泛型的上限类型,不代表泛型等于该上限类型。你这里声明的泛型 F extends (a: string, b: number) => any,只表示 F 必须兼容这个函数签名,完全可以包含额外的参数、更严格的参数类型,例如以下类型都符合 F 的约束:
// 多了第三个必填参数 type F1 = (a: string, b: number, c: boolean) => void // 参数是更窄的字面量类型 type F2 = (a: 'x' | 'y', b: 1 | 2) => void
对于上述符合约束的 F 类型,Parameters<F> 分别是 [string, number, boolean] 和 ['x'|'y', 1|2],你传入的 ['a', 0] 显然无法匹配所有可能的 Parameters<F>,因此 TypeScript 会抛出类型错误。
解决方案
- 方案1:去掉不必要的泛型,直接固定函数参数类型
如果你的test函数接收的f固定只需要前两个参数,不需要支持额外的参数变体,直接把参数类型写死即可:
function test(f: (a: string, b: number) => any) { return call(f, 'a', 0) }
此时 Parameters<typeof f> 是固定的 [string, number],和你传入的参数完全匹配,不会报错。
- 方案2:使用类型断言跳过检查
如果你确定所有传入test的f都兼容['a', 0]这组参数,可以用类型断言主动告诉 TypeScript 类型符合要求:
function test<F extends (a: string, b: number) => any>(f: F) { return call(f, 'a', 0 as unknown as Parameters<F>) }
注意该方案需要你自行保证参数合法性,TypeScript 不会再做额外校验。
内容的提问来源于stack exchange,提问作者Jeff Williams
相关产品推荐
相关产品推荐

