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

如何实现接收模板字面量参数的TypeScript泛型类型?

实现支持模板字面量参数的TypeScript泛型

要实现基于模板字面量生成对象键名的泛型,可以利用TypeScript的高阶泛型和模板字面量类型完成。以下是针对需求的具体实现:

步骤1:定义基础数据类型

先明确核心业务数据的类型:

type Data = {
  foo: number,
  bar: number
};

步骤2:实现通用模板泛型

定义Template泛型,它接收原类型、键名转换规则、可选值类型三个参数,自动生成带模板化键名的新类型:

type Template<
  T extends Record<string, unknown>,
  Transform extends <K extends string>(key: K) => string,
  V = void
> = {
  // 遍历原类型的每个键,通过Transform生成新键名
  [K in keyof T as K extends string ? ReturnType<Transform> : never]: 
    // 若未指定V则沿用原类型属性值,否则使用指定的V类型
    V extends void ? T[K] : V;
};

步骤3:组合生成目标类型

通过Template泛型分别生成各类元数据字段,再与基础Data类型交叉组合,得到最终的API返回类型:

type DataAndMetaData =
  Data &
  // 生成带_comment后缀的字段,值类型为string
  Template<Data, <K extends string>(k: K) => `${k}_comment`, string> &
  // 生成带_formatted_value后缀的字段,值类型为string
  Template<Data, <K extends string>(k: K) => `${k}_formatted_value`, string> &
  // 生成带_前缀和_created_by后缀的字段,值类型为string
  Template<Data, <K extends string>(k: K) => `_${k}_created_by`, string>;

效果验证

最终DataAndMetaData的结构完全匹配你提供的API返回对象:

// 等价于:
type DataAndMetaData = {
  foo: number;
  bar: number;
  foo_comment: string;
  bar_comment: string;
  foo_formatted_value: string;
  bar_formatted_value: string;
  _foo_created_by: string;
  _bar_created_by: string;
};

内容的提问来源于stack exchange,提问作者BobtheMagicMoose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:41:14