TypeScript中如何实现函数调用时混合指定和自动推导泛型参数
解决方案
TypeScript 目前没有原生支持部分泛型参数推断,泛型参数只能选择全部手动传入、或者全部走自动推导。要实现「手动指定部分泛型,剩余泛型由参数自动推导」的需求,最通用的方案是通过柯里化拆分函数,将需要手动指定的泛型放在第一层函数,需要自动推导的泛型放在第二层函数:
const bar: string = ""; // 第一层仅声明需要手动传入的泛型 A const foo = <A>() => { // 第二层声明需要自动推导的泛型 B,实现核心逻辑 return <B>(arg: B): B => { const sideEffect: A = 0 as any; // 此处替换为你实际的业务逻辑 return arg; } }
调用方式如下:
- 全量自动推导:
foo()(bar),泛型A走默认约束(可自行给A添加默认类型),B自动推导为string - 混合指定:
foo<number>()(bar),手动指定A为number,B自动推导为string - 全量手动指定:
foo<number>()<string>(bar),可满足极端场景下的全量指定需求
如果希望避免两层括号调用,也可以给不需要手动指定的泛型添加默认类型,该方案仅适用于TypeScript 4.7以上版本:
const foo = <A, B = unknown>(arg: B): B => { const sideEffect: A = 0 as any; return arg; } // 调用时如果只传A,B会自动从参数推导,不再报错 foo<number>(bar); // 正常运行,B推导为string
注意:默认类型方案的泛型推导存在边界问题,复杂场景下优先选择柯里化拆分方案。
内容的提问来源于stack exchange,提问作者Almaju
相关产品推荐
相关产品推荐

