javascript - 返回自身数组的类方法。如何注释和继承?

标签 javascript typescript

下面的示例是真实代码中发生的事情的原始表示(我没有使用 HTML 或前端。下面的代码是一个虚拟代码。如果从前端的 Angular 来看它没有任何意义,请见谅)
TL,博士
我正在努力指定方法的返回类型,该方法将返回类 的类实例数组调用此方法的来源 .
回到虚拟代码:
PageElement.ts

class PageElement {
    public element: HTMLElement
    constructor(
        public elementSelector: string,
        public elementName: string,
        public description: string,
        
    ) {
        this.element = document.getElementById(this.elementSelector)!;
        
    }
 
    getAll() {
        let foundElements = document.querySelectorAll(this.elementSelector);
        let returnElements = [];
        let constructor = this.constructor as any;
        foundElements.forEach(
            element => returnElements.push(
                new constructor(
                    element.attributes['id'].value,
                    this.elementName + (returnElements.length + 1),
                    this.description
                )
            )
        )
 
        return returnElements;
    }
}

假设这个类有很多子类,例如:
class InputElement extends PageElement {
    constructor(
        elementSelector: string, 
        elementName: string, 
        description: string) {
        super(elementSelector, 
            elementName, 
            description
        )
    }
 
    exclusiveInputMethod() {
        // this method exist only on InputElement 
    }
}

我想解决两个核心问题
getAll() {
        let constructor = this.constructor as any;
}
上面的逻辑在 JS 中运行良好,例如 new this.constructor(...) .
但是,TS 不允许这样做,但出现错误:This expression is not constructable. Type 'Function' has no construct signatures.ts(2351)所以我需要做let constructor = this.constructor as any; .但这会扼杀 IntelliSense 和所有类型安全。
当然,您可以说:“只需返回 PageElement 的数组即可。 ,呃”:
getAll() {
        let foundElements = document.querySelectorAll(this.elementSelector);
        let returnElements = [];
        foundElements.forEach(
            element => returnElements.push(
                new PageElement(
                    element.attributes['id'].value,
                    this.elementName + (returnElements.length + 1),
                    this.description
                )
            )
        )
 
        return returnElements;
    }

但是继承的问题就出现在这里:
class InputElement extends PageElement {
    constructor(
        elementSelector: string, 
        elementName: string, 
        description: string) {
        super(elementSelector, 
            elementName, 
            description
        )
    }
 
    exclusiveInputMethod() {
        // do stuff
    }
}
万一getAll将返回 PageElement 的数组我将无法访问 exclusiveInputMethod .因为当我调用 InputElement.findAll()它将返回 PageElement[]而不是 InputElement[] .
我将总结我的问题:new this.constructor 的正确等价物是什么?对于 TS,它知道我正在创建这个特定类的实例吗?
第二个问题是(嗯,其实和第一个一样):
如何注释(或使 TS 正确推断返回类型)方法 getAll()所以它总是知道返回类型是调用此方法的类实例的数组?

最佳答案

指定 this[]作为您的方法的返回类型:

class PageElement {
  getAll(): this[]  {}
}

class InputElement extends PageElement {
  aSpecificInputElementMethod() {}
}

const inputElement = new InputElement();
const inputElements = inputElement.getAll();

inputElements[0].aSpecificInputElementMethod(); // valid;
TS Playground 上查看实际情况.

关于javascript - 返回自身数组的类方法。如何注释和继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65856683/

相关文章:

javascript - Typescript 未按一致的顺序编译类

node.js - 无法在 Typescript 中使用 Bluebird promisifyAll Redis api

使用 ngFor 提交的 Angular 2 ngModel

javascript - 计算 Javascript 中 2 个 SQLite 日期时间之间的差异

javascript - 单击时 jQuery 下拉列表不显示

Javascript:返回包含其他函数的对象的函数?这个叫什么?

javascript - 在 jqGrid 中调用所选行仅有效一次

javascript - 编写具有多个参数的 javascript 函数

javascript - 在 Angular 2/Typescript 中使用 IScroll

javascript - 带有参数的 Typeorm 监听器