【问题标题】:Variable/infinity type arguments for generic class in TypeScriptTypeScript 中泛型类的变量/无穷大类型参数
【发布时间】:2018-08-04 23:03:41
【问题描述】:

在 TypeScript 中,我们可以像在 C# 中一样拥有泛型类:

export class MyClass<T> { }

但是可以传递可变数量的泛型作为参数吗?我的意思是像

function withVariableArgs(...args: any[]){  }

但是我希望将其作为通用(伪代码)

export class MyClass<...args:any[]> { }

这样我就可以做到new MyClass&lt;number,string&gt;new MyClass&lt;number&gt;。这在TS中可能吗?

背景:通用类型事件

我想要一个通用的事件处理程序,它可以让我为事件提供强类型。 This typesafe EventEmitter 只适用于单一类型。有时我需要在同一个事件中传递多种类型,例如字符串 整数。使用这个处理程序,唯一的可能性似乎是创建一个接口

  interface EventArgs{
      id:number,
      name:string
  }

然后使用let event = new TypedEvent&lt;EventArgs&gt;() 之类的类型。对于复杂类型,定义这样的模型似乎是一种很好的做法。想想如果我们只有两种或三种类型,我认为这有点矫枉过正,会导致复杂性不断增加,而不会提供额外的价值。简单地创建一个像let event = new TypedEvent&lt;number,string&gt; 这样的事件并执行event.emit(1, 'test') 而无需创建模型和实例化它们会很棒。

【问题讨论】:

    标签: typescript generics events


    【解决方案1】:

    Typescript 中没有可变参数类型。它已被多次提出。但是,您可以通过元组类型获得您想要的功能。

    如果这是您的事件处理程序...

    class TypedEvent<T>
    {
        public emit(args: T): void { /* ... */ }
    }
    

    ...您可以执行以下操作:

    const eventHandler = new TypedEvent<[string, number]>();
    
    eventHandler.emit(["1", 1]);
    

    【讨论】:

      【解决方案2】:

      作为@Shane 响应的扩展,您可以将扩展运算符与元组一起使用。 https://github.com/microsoft/TypeScript/pull/24897

      class TypedEvent<T extends any[]> {
          public emit(...args: T): void { /* ... */
          }
      }
      const eventHandler = new TypedEvent<[string, number]>();
      eventHandler.emit("1", 1);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-22
        • 2021-07-10
        • 1970-01-01
        • 2016-12-05
        • 1970-01-01
        • 2019-07-09
        • 2019-05-30
        • 2016-11-01
        相关资源
        最近更新 更多