如何在TypeScript中仅指定泛型TOptions的dataT类型参数?
TypeScript 泛型仅指定中间参数并保留默认值的实现方法
原类型定义
type TOptions< bodyT = {[key: string]: unknown}, dataT = unknown, paramsT = Record<string, unknown>, > = { body: bodyT, data: dataT, params: paramsT };
需求
使用TOptions时仅为dataT指定类型,同时让bodyT和paramsT沿用原类型的默认定义,类似JavaScript中传入undefined触发默认参数的效果。
解决方案
方法一:调整泛型参数顺序(推荐,最简洁)
如果可以修改原TOptions的泛型参数顺序,把需要频繁指定的dataT放在第一个位置,这样直接指定第一个参数即可自动沿用后面的默认值:
// 修改泛型参数顺序,将dataT前置 type TOptions< dataT = unknown, bodyT = {[key: string]: unknown}, paramsT = Record<string, unknown>, > = { body: bodyT, data: dataT, params: paramsT }; // 仅指定dataT为string,bodyT和paramsT用默认值 type TAutoMock = TOptions<string>;
方法二:创建辅助泛型类型(不修改原类型时使用)
如果不能修改原TOptions的定义,可以创建一个辅助泛型,专门用来指定dataT并复用原类型的默认值:
// 提取原TOptions的默认类型,避免硬编码重复 type DefaultBodyT = TOptions extends TOptions<infer T, any, any> ? T : never; type DefaultParamsT = TOptions extends TOptions<any, any, infer T> ? T : never; // 辅助类型,仅接收dataT参数 type TOptionsWithData<dataT> = TOptions<DefaultBodyT, dataT, DefaultParamsT>; // 使用示例:指定dataT为string,其余用默认值 type TAutoMock = TOptionsWithData<string>;
方法三:显式传入默认类型(简单但不够优雅)
如果原类型的默认类型比较简单,也可以直接显式传入默认类型作为占位:
// 直接传入bodyT的默认类型,指定dataT为string,paramsT沿用默认 type TAutoMock = TOptions<{[key: string]: unknown}, string>;
这种方法的缺点是硬编码了默认类型,后续原TOptions的默认值修改时需要同步更新这里的代码。
内容的提问来源于stack exchange,提问作者Henok Tesfaye
相关产品推荐
相关产品推荐

