需要基于 TypeScript 中的另一个参数的给定类型的参数
Posted
技术标签:
【中文标题】需要基于 TypeScript 中的另一个参数的给定类型的参数【英文标题】:Require parameter of given type based on another parameter in TypeScript 【发布时间】:2020-05-31 01:19:34 【问题描述】:让我们拥有发送电子邮件的 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
?原因是因为每个模板在ETemplate
的基础上都有不同的IParams
。
我知道 TypeScript 有泛型,但我不确定我是否可以用它们实现这一点...
【问题讨论】:
【参考方案1】:在这种情况下,您不需要使用泛型。请改用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
【讨论】:
以上是关于需要基于 TypeScript 中的另一个参数的给定类型的参数的主要内容,如果未能解决你的问题,请参考以下文章
我可以基于 TypeScript 中的另一个接口以某种方式定义接口中的索引名称吗?
基于 Azure 流分析 T-SQL 查询中的另一个参数动态拆分参数
使用 Angular 和 TypeScript 使用最新 NativeScript 中的参数进行导航
如何将样式化组件作为属性添加到 TypeScript 中的另一个样式化组件?