我可以创建一个具有受限泛型类型的超类吗?

时间:2015-03-24 23:03:21

标签: typescript1.4

我有课:

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 个答案:

答案 0 :(得分:1)

这绝对是可能的,下面的代码是一个如何完成这样的事情的例子:

class LinkedList<T> {
    el: T
}

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


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

list.el将为HTMLElement | 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);
    }
}