gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:58:13 27 4
gpt4 key购买 nike

如何在 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 存储时,它的类型是通用的。

谢谢!!

最佳答案

由于 typescript 泛型是使用类型删除实现的 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 没有明确派生自它,但它实现了这一点。

关于generics - 如何创建 Typescript 类的泛型类型的新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29436747/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com