如何将TypeScript类型导出为对象以展示可用键列表
在TypeScript中实现自动生成邮件参数映射的方案
可以实现,核心思路是让运行时参数列表和TypeScript类型保持同步——因为TypeScript的接口/类型仅存在于编译阶段,无法直接从类型生成运行时对象,所以我们先定义运行时的参数列表,再基于它推导对应的类型,后续增删邮件类型时只需修改一处即可。
实现代码
export type CustomEmailPayload = Record<string, string>; // 1. 定义基础字段的运行时数组 const baseLessonFields = ['teacherGivenName', 'lessonDate'] as const; // 2. 定义各邮件类型的额外字段 const reminderExtraFields = ['chatUrl'] as const; const followUpExtraFields = ['reviewYourTeacherUrl'] as const; // 3. 生成最终的参数映射对象(直接给非技术人员用) export const emailTemplateParamsMap = { Reminder: [...baseLessonFields, ...reminderExtraFields], FollowUp: [...baseLessonFields, ...followUpExtraFields], } as const; // 4. 从运行时数组推导对应的Payload类型 type ExtractPayload<T extends readonly string[]> = Record<T[number], string> & CustomEmailPayload; // 5. 生成最终的EmailTemplateParameters类型(和原类型完全一致) export type EmailTemplateParameters = { [K in keyof typeof emailTemplateParamsMap]: ExtractPayload<typeof emailTemplateParamsMap[K]>; };
后续维护说明
- 新增邮件类型:比如要加
Feedback类型,只需在emailTemplateParamsMap中新增键值对,同时定义对应的额外字段数组即可,类型会自动推导。 - 删除邮件类型:直接从
emailTemplateParamsMap中删除对应的键即可,类型也会同步更新。
这样既保证了TypeScript类型的正确性,又能自动生成非技术人员需要的参数列表,无需手动维护两份内容。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

