给定类型的Require参数基于TypeScript中的另一个参数

时间:2020-02-15 14:53:55

标签: typescript generics interface typescript-typings

我们具有用于发送电子邮件的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 个答案:

答案 0 :(得分:2)

在这种情况下,您不需要使用泛型。请改用discriminated unions

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