2015-03-24 210 views
1

我有類:我可以使用受限通用類型創建超類嗎?

export class LinkedList<t> 

我目前使用創建一個超類:

export class ListBody extends collections.LinkedList<Element> 

而這一切的偉大工程。但是,我在其他幾個類中聲明瞭這個類,並且在每個地方它實際上只需要幾個Element的超類。所以我想在茨艾倫其他地方,而不是聲明:

this.body = new moduleListBody.ListBody(); 

聲明:

this.body = new moduleListBody.ListBody<ElementOne | ElementTwo>(); 

有沒有辦法做到這一點?我不能跳過ListBody類,因爲我有很多代碼在Element對象上運行。

更新:例如

export class Element { 

} 

export class LinkedList<t> { 

    public add(index : number, value : t); 
    public add(index : number, collection : LinkedList<t>); 
    public add(index : number, collection : t[]); 
    add(index : number, arg : t | LinkedList<t> | t[]) { 
    } 
} 

export class ListBody <T extends Element> extends LinkedList<T> { 

    public fubar(): void { 
     var element = new Element(); 
     this.add(0, element); 
    } 
} 

回答

1

這絕對是可能的,下面的代碼是如何完成這樣的一個例子:

class LinkedList<T> { 
    el: T 
} 

class ListBody<T extends Element> extends LinkedList<T> { } 


var list = new ListBody<HTMLElement | SVGElement>(); 

list.elHTMLElement | SVGElement

更新:您需要將類型傳遞給fubar,或者將T的構造函數存儲在擴展類中。請看下圖:

export class ListBody <T extends Element> extends LinkedList<T> { 
    public fubar(Type: new() => T): void { 
     var element = new Type(); 
     this.add(0, element); 
    } 
} 

export class ListBody<T extends Element> extends LinkedList<T> { 
    Type: new() => T; 

    public fubar(): void { 
     var element = new this.Type(); 
     this.add(0, element); 
    } 
} 
+0

非常感謝你! – 2015-03-27 14:42:42

+0

這不起作用。當我調用LinkedList上的方法傳遞Element對象時,我收到了一個編譯錯誤 - 元素不能分配給類型爲T的參數。 – 2015-03-27 16:10:51

+0

有趣,你可以發佈[gist](https://gist.github.com/ )與相關的代碼。我可以嘗試幫助你! – wjohnsto 2015-03-27 16:13:34

相關問題