Как использовать Typescript для определения строго типизированных параметров шаблона электронной почты? - PullRequest
1 голос
/ 30 января 2020

У меня есть несколько различных шаблонов электронной почты, каждый из которых имеет свои параметры.

Я могу определить тип для каждого шаблона:

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

И для каждого шаблона я могу определить параметры:

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

Затем я могу определить интерфейс EmailTemplate:

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

Есть ли способ напечатать это так, чтобы при шаблоне 'welcomeEmail' тип params был WelcomeEmail * * 1014

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Это может быть сделано в последних версиях Typescript, если вы немного измените типы. Это работает путем получения TemplateType и EmailTemplate из одного и того же типа EmailTemplates. 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 вместо того, чтобы передавать его как типовой параметр c, но я не уверен, как.

0 голосов
/ 30 января 2020
type TemplateType = 'welcomeEmail' | 'referralEmail' | 'loginEmail'

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

interface WelcomeEmailTemplate {
  template: 'welcomeEmail';
  params: WelcomeEmail;
}

interface ReferralEmailTemplate {
  // ...
}

interface LoginEmailTemplate {
  // ...
}

type EmailTemplate = WelcomeEmailTemplate | ReferralEmailTemplate | LoginEmailTemplate

const myEmail: EmailTemplate = {
  template: 'welcomeEmail',
  params: {
    // then type checking and hinting is here for WelcomeEmailTemplate
  },
}
...