TypeScript中如何仅显式指定部分泛型参数,让另一部分从函数参数自动推断
TypeScript中如何仅显式指定部分泛型参数,让另一部分从函数参数自动推断
嘿,我完全懂你的困扰!你想要的是只手动指定Params这个泛型参数,而让Method从传入的method参数里自动推断出具体的字面量(比如"GET"),而不是要么被迫显式传两个泛型,要么让Method变成"GET"|"POST"的联合类型对吧?
咱们先来拆解下你当前代码的问题:
- 第一种写法给
Method设了默认值"GET"|"POST",导致即使你传了method: "GET",TS也只会把Method推断成联合类型,而不是具体的字面量; - 第二种写法去掉了默认值,但显式指定
Params时,TS会要求你必须同时指定Method,不然就报错,这显然不是你想要的。
下面给你两种可行的解决方案,按需选择就行:
方案一:使用TypeScript 4.7+的泛型占位符_
如果你的项目已经升级到TypeScript 4.7或以上版本,这个方法最简洁——用_作为你想让TS自动推断的泛型参数的占位符:
const func = <Params, Method extends "GET" | "POST">({ params, method, }: { params?: Params; method: Method }) => {}; // 用_代替Method,让TS自动从method参数推断具体类型 func<{ qwe: 123 }, _>({ method: "GET" });
这样写后,TS会自动把Method推断成字面量"GET",而你只需要显式指定Params就行。
方案二:柯里化函数(兼容旧版本TS)
如果你的项目还在使用低于4.7的TS版本,那柯里化是更稳妥的选择。我们把函数拆成两层:第一层用来指定Params泛型,第二层接收包含method的参数,这样Method就能自动推断了:
const func = <Params>() => <Method extends "GET" | "POST">({ params, method, }: { params?: Params; method: Method }) => {}; // 先调用第一层指定Params,再传入参数让TS自动推断Method func<{ qwe: 123 }>()({ method: "GET" });
虽然多了一对括号,但兼容性拉满,不管什么版本的TS都能正常工作,而且逻辑也很清晰:先固定你需要手动指定的泛型,剩下的交给TS自动处理。
两种方案都能解决你的问题,选哪种就看你的项目TS版本啦!
备注:内容来源于stack exchange,提问作者Alexey Pavlyuk
相关产品推荐
相关产品推荐

