【问题标题】:Can I create a super-class with a restricted generic type?我可以创建一个具有受限泛型类型的超类吗?
【发布时间】:2015-03-28 00:51:00
【问题描述】:

我有课:

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

【问题讨论】:

    标签: typescript1.4


    【解决方案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);
        }
    }
    

    【讨论】:

    • 那行不通。当我调用 LinkedList 上的方法以传入 Element 对象时出现编译错误 - 元素不可分配给 T 类型的参数。
    • 有趣,你能发一个gist 和相关代码吗?我可以尽力帮助你!
    • 谢谢。但我认为这不值得为了让我的类型检查更加严格而进行新调用。太糟糕了。我将保留这个问题,以防打字稿团队中的一个知道没有新的方法。谢谢。
    • 我认为这个想法是,如果您能够说 this.add(0, new Element()),那么这将违反您对 ListBody&lt;T extends Element&gt; extends LinkedList&lt;T&gt; 的定义,因为您只能确定任何 ListBody 中都会包含 Element 类型的项目.
    • 你是对的。我没有想到这一点。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多