如何创建 Typescript 类的泛型类型的新实例?

2024-04-18

如何在 Typescript 中按预期完成以下工作?

export class ProxyObject<T> {
    private _dataObject:T;
    constructor(dataObject?:T) {
        if (dataObject) {
            this.dataObject = dataObject;
        } else {
            //create a new instance of the generic <T> here
            this.dataObject = <T> new Object();
        }
    }
    set dataObject(dataObject:T) {
        this._dataObject = dataObject;
    }
    get dataObject():T {
        return this._dataObject;
    }
}

export class ClassA {
   myCoolProperty = "My Cool Property";
}

当我执行以下操作时:

export class MyObject extends ProxyObject<ClassA> {
}

进而:

var obj = new MyObject();
obj.dataObject.myCoolProperty === undefined

正如我所期望的那样,MyObject 内的 dataObject 上不存在 ClassA 属性或函数。例如,我期望 dataObject 具有 myCoolProperty。

我正在尝试编写一个 ProxyObject 类,扩展时它的 DataObject 存储将被键入为通用类型。

Thanks!!


由于打字稿泛型是使用类型擦除来实现的,因此运行时 T 不存在,因此您可以将该类作为参数传递给基类构造函数,然后使用它来创建新对象。

export class DataObjectBase {
}

export class ProxyObject<T extends DataObjectBase> {
    private _dataObject: T;
    constructor(dataObject?: T, cls?: typeof DataObjectBase) {
        if (dataObject) {
            this.dataObject = dataObject;
        } else {
            //create a new instance of the generic <T> here
            this.dataObject = <T> new cls();
        }
    }
    set dataObject(dataObject: T) {
        this._dataObject = dataObject;
    }
    get dataObject(): T {
        return this._dataObject;
    }
}



export class ClassA {
    myCoolProperty = "My Cool Property";
}


export class MyObject extends ProxyObject<ClassA> {
    public constructor(dataObject?: ClassA) {
        super(dataObject, ClassA);
    }
}

new MyObject();
obj.dataObject.myCoolProperty !== undefined

这种方法仍然需要派生类中的一些代码,但至少它保留了基类中的所有逻辑

DataObjectBase 类是必要的,因为如果我使用 typeof Object 代替,ClassA 就无法满足 Object 类的签名(因为 ClassA 没有 Object 所具有的构造函数)。 DataObjectBase 是一个具有单个构造函数且不带参数的类,ClassA 尽管没有显式派生自它,但仍满足该构造函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建 Typescript 类的泛型类型的新实例? 的相关文章

随机推荐