You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:40:07