如何在TypeScript中实例化泛型类型?

时间:2018-04-19 12:27:07

标签: typescript

我正在尝试在TypeScript中实例化一个泛型类。

在C#中我会这样做

class MyPacket<T> {...}

var t = typeof(...);
var genericContainer = typeof(MyPacket<>).MakeGenericType(new[]{ t });
var instance = Activator.CreateInstance(genericContainer);

我的用例是我正在接收来自网络的消息。 我还有一个EventEmitter,希望用正确的类型调用它。

(msg: Message): void => {
    t: ??? = messageNameToType[msg.name];
    const m: RPCConsumerMessage<T> = ???;
    emitter.emit(msg.name, m);
}

发射器的使用方式如下:

emitter.on('exampleMessageId', (msg: RPCConsumerMessage<ExampleMessage>) => {
    // can now easily use the message in a typesafe way: msg.data.exampleText
  });

我的问题:

TypeScript中的等价物是什么,或者实例化泛型类型的整个方法有缺陷吗?是否有另一种模式常用于TypeScript中的那些类型的问题?

1 个答案:

答案 0 :(得分:1)

与C#不同,泛型类实例化在运行时实际上是不同的类,在Typescript中,泛型类型参数在编译时被擦除,因此不同的泛型类在运行时实际上是同一个类。

(msg: Message): void => {
    const t: any= messageNameToType[msg.name]; // does not really matter.
    const m: RPCConsumerMessage<any> = new RPCConsumerMessage<any>();
    emitter.emit(msg.name, m);
}