TypeScript中泛型类的变量/无穷大类型参数

时间:2018-02-25 10:23:32

标签: typescript generics events

在TypeScript中,我们可以使用C#中的泛型类:

export class MyClass<T> { }

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

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

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

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

这样我就无法new MyClass<number,string> new MyClass<number>。这可能在TS?

背景:通用类型事件

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

  interface EventArgs{
      id:number,
      name:string
  }

然后使用类似let event = new TypedEvent<EventArgs>()的类型。对于复杂类型,定义这样的模型似乎是很好的做法。如果我们只有两三种类型,我认为这是过度的,并且会导致日益复杂而不提供额外的价值。简单地创建像let event = new TypedEvent<number,string>这样的事件并执行event.emit(1, 'test')而不需要创建模型并实例化它们会很棒。

2 个答案:

答案 0 :(得分:1)

Typescript中没有可变参数类型。已经提出很多次。但是,你可以通过元组类型得到你想要的东西。

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

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

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

const eventHandler = new TypedEvent<[string, number]>();

eventHandler.emit(["1", 1]);

答案 1 :(得分:0)

作为@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);