javascript - 如何使用Typescript定义强类型电子邮件模板参数?

标签 javascript typescript types typescript-typings typescript3.0

我有许多不同的电子邮件模板,每个模板都有不同的参数。

我可以为每个模板定义一个类型:

type TemplateType = 'welcomeEmail' | 'referralEmail' | 'loginEmail'

对于每个模板,我可以定义参数:

interface WelcomeEmail {
  firstName: string;
  lastName: string;
  ...
}

然后我可以定义一个 EmailTemplate 接口(interface):

interface EmailTemplate {
  template: TemplateType;
  params: WelcomeEmail | ReferralEmail | LoginEmail;
}

有没有办法输入此内容,以便当模板为“welcomeEmail”时,params 类型为 WelcomeEmail

最佳答案

如果您稍微更改一下类型,就可以在最新版本的 Typescript 中完成此操作。这是通过从相同的 EmailTemplates 类型获取 TemplateTypeEmailTemplate 来实现的。 Typescript 知道 TemplateType 的成员对应于 EmailTemplates 的键,并且它可以使用该关系来查找与给定 TemplateType 关联的值类型>.

type EmailTemplates = {
  welcomeEmail: {
    firstName: string;
    lastName: string;
  };
  referralEmail: {
    referrer: string;
  };
}

type TemplateType = keyof EmailTemplates;

type EmailTemplate<T extends TemplateType> = {
  template: T;
  params: EmailTemplates[T]
}

const myEmail: EmailTemplate<'referralEmail'> = {
  template: 'referralEmail',
  params: { referrer: 'test' },
}

可能有某种方法可以推断 TemplateType,而不必将其作为泛型类型参数传递,但我不确定如何实现。

关于javascript - 如何使用Typescript定义强类型电子邮件模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59979547/

相关文章:

typescript - 我如何定义将键映射到该键的泛型的类型,例如Record<K, SomeGeneric<key>>?

javascript - 在 typescript 中扩展 Angular 全局对象

Java 检查 Stack 是否包含某个类

javascript - jQuery .slideToggle – 以某种方式被多次触发

javascript - 防止 jQuery 函数在当前函数完成之前执行

javascript - 尝试在 2 个 HTML 文件之间共享的 JS 文件内使用全局数组,但失败

javascript - 如何更改 NW.js 中的 JSON 保存位置/目录

typescript - 从基类调用方法时,父类中尚未初始化的值

Typescript 编译器没有检测到带有 webpack 的 lodash 的缺失导入

java - 对具有多种类型的ArrayList进行求和