让我们拥有用于发送电子邮件的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具有泛型,但是我不确定是否可以使用它们来实现。
在这种情况下,您不需要使用泛型。改用有区别的联合:
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("[email protected]", { type: TemplateType.Template1, params: { aaa: 123 } }); // OK
sendEmail("[email protected]", { type: TemplateType.Template2, params: { aaa: 123 } }); // Error as expected
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句