需要基于 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 中的另一个样式化组件?

如何将一种泛型类型的结构复制到 TypeScript 中的另一种泛型?

基于可选函数参数的不同返回类型 - Typescript