我可以使用泛型来调用它的构造函数吗?

时间:2014-12-05 15:51:38

标签: typescript

我有一个Dictionary类,我想做以下事情:

export class Dictionary<K, V> {
   private table:{ [key: string]: IDictionaryPair<K, V> };
   private nElements:number;

   constructor(src:Dictionary<K, V>) {

            for (var item in src.table)
                if (src.hasOwnProperty(item)) {
                    windward.trap();
                    var valCopy = new V(src[<string>item]);
                    this.setValue(<K>item, valCopy);
                }
   }
}

除了“var valCopy = new V(src [item]);”之外,这一切都会很好用。不被允许。有没有办法做到这一点?因为如果类型V有一个复制构造函数,那么这一切都是有效的,包括类型检查。

有办法做到这一点吗?

谢谢 - 戴夫

1 个答案:

答案 0 :(得分:1)

所有类型信息都在运行时被删除,因此您需要在运行时仍然存在的内容以便新建一个实例:

export class Dictionary<K, V> {
   private table:{ [key: string]: IDictionaryPair<K, V> };
   private nElements:number;

   constructor(src:Dictionary<K, V>, myType: any) {

            for (var item in src.table)
                if (src.hasOwnProperty(item)) {
                    windward.trap();
                    var valCopy = <V> new myType(src[<string>item]);
                    this.setValue(<K>item, valCopy);
                }
   }
}

您甚至可以约束它,以便保证构造函数签名符合您的期望:

export interface MyNewable<T> {
    new(input: string) : T;
}

export class Dictionary<K, V> {
   private table:{ [key: string]: IDictionaryPair<K, V> };
   private nElements:number;

   constructor(src:Dictionary<K, V>, type: MyNewable<V>) {

            for (var item in src.table)
                if (src.hasOwnProperty(item)) {
                    windward.trap();
                    var valCopy = <V> new type(src[<string>item]);
                    this.setValue(<K>item, valCopy);
                }
   }
}

使用约束版本的示例(通过不传入src简化)

export class MyClass {
    constructor(input: string) {

    }
}

export class Example {
    constructor(input: number) {

    }
}

var d = new Dictionary<string, MyClass>(null, MyClass);

// Complier warning - type `Example` isn't compatible.
var e = new Dictionary<string, MyClass>(null, Example);