我们具有用于发送电子邮件的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具有泛型,但是我不确定是否可以使用它们来实现...
答案 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