在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')
而不需要创建模型并实例化它们会很棒。
答案 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);