如何实现接收模板字面量参数的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
相关产品推荐
相关产品推荐

