2014-12-05 5 views
0

У меня есть словарь класса, и я хотел бы сделать следующее:Могу ли я использовать generic для вызова его конструктора?

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); 
       } 
    } 
} 

Это все отлично работает, кроме «вар valCopy = новый V (ЦСИ [пункт]);» не допускается. Есть ли способ сделать это? Поскольку, если тип V имеет конструктор копирования, то это все допустимо, включая проверку типов.

Есть ли способ сделать это?

спасибо - Дэйв

+0

V - это параметр типа, а не тип. Невозможно узнать, как выглядят конструкторы, пока вы не примените их к определенному типу. –

ответ

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); 
+1

О, вау, спасибо! –

Смежные вопросы