网站搜索

泛型 - 在 TypeScript 中,如何从基类返回子类?


我有一个基类和一个或多个从它继承的子类。我正在尝试实现轻松创建 HTML 元素的功能。

我的第一个类是基类,包含所有 HTML 元素的通用方法:

class $NewElement<E extends HTMLElement> {

    public element: E = null;

    constructor(name: string) {
        this.element = <E>document.createElement(name);
    }

    public className(className: string): any {
        this.element.className = className;
        return this;
    }

}

我有其他类,每个类都继承上述类。例如,这是用于 img 标签的类:

class $NewImage extends $NewElement<HTMLImageElement> {

    constructor() {
        super('img');
    }

    public source(fileName: string): $NewImage {
        this.element.src = fileName;
        return this;
    }

}

我想以类型安全的方式做类似这样的事情:

let img = new $NewImage().className('a').source('b').element;

这该如何完成?调用 className() 后,我不再处理一个 $NewImage 对象,而是一个 $NewElement 对象,而 $NewElement 对象没有 source() 方法。

答案#1

您可以将 this 用作一种类型,这意味着返回类型与调用此方法的类型相同:

class $NewElement<E extends HTMLElement> {
    public element: E;
    constructor(name: string) {
        this.element = <E>document.createElement(name);
    }
    public className(className: string): this {
        this.element.className = className;
        return this;
    }
}

class $NewImage extends $NewElement<HTMLImageElement> {
    constructor() {
        super('img');
    }
    public source(fileName: string): this {
        this.element.src = fileName;
        return this;
    }
}

let img = new $NewImage().className('a').source('b').element; //works