Обязательный параметр данного типа на основе другого параметра в TypeScript - PullRequest
1 голос
/ 15 февраля 2020

Давайте иметь функцию TypeScript для отправки электронных писем:

enum ETemplate {
  EXAMPLE1, EXAMPLE2
}

function sendEmail(to: string, template: ETemplate, params: IParams): Promise<void>{
  await this.mailService.send(to, template, params);
}

interface IParams {
  // depends on template type (ETemplate)
}

Как потребовать params в зависимости от введенного мной типа шаблона? Причина в том, что каждый шаблон имеет разные IParams на основе ETemplate.

. Я знаю, что у TypeScript есть дженерики, но я не уверен, что смогу добиться этого с ними ...

1 Ответ

2 голосов
/ 15 февраля 2020

Вам не нужно использовать дженерики в этом случае. Используйте различимые союзы вместо:

enum TemplateType {
    Template1,
    Template2
}

type Template =
    | { type: TemplateType.Template1, params: { aaa: number } }
    | { type: TemplateType.Template2, params: { bbb: string, ccc?: boolean } };

const sendEmail = async (to: string, template: Template): Promise<void> => {
    if (template.type === TemplateType.Template1) {
        template.params.aaa; // number

        return;
    }

    if (template.type === TemplateType.Template2) {
        template.params.bbb; // string
        template.params.ccc; // boolean | undefined

        return;
    }

    template; // never
}


sendEmail("example@example.com", { type: TemplateType.Template1, params: { aaa: 123 } }); // OK
sendEmail("example@example.com", { type: TemplateType.Template2, params: { aaa: 123 } }); // Error as expected
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...