我正在编写一个处理类实例化(unmarshaller)的代码。
首先,创建一个对象。我使用let obj = new BaseModel
。
在处理输入数据的过程中,我最终确定了未编组对象的类。
我有这个类,用<T extends BaseModel> clazz : { new (): T }
表示。
现在我想改变之前创建的对象的类,以一种不会与TypeScripts类处理代码冲突的方式。
这条路对吗?
Object.getPrototypeOf(result).constructor = clazz;
编辑:这不是它。当属性值保持不变时,浏览器控制台仍然显示new
使用的类型。
或者在TypeScript中有一个结构可以以更兼容未来的方式来做这件事? 或者在TypeScript中有一个结构可以以更兼容未来的方式来做这件事?
这是正确的。在TypeScript中使用constructor
来确定创建函数,就像在JavaScript中一样。
如果我正确理解您的问题,您希望在运行时将对象的类型从您使用new
创建的类型更改为另一种可能派生的类型。
我认为你最好先实例化一个你想要的类的实例,然后把另一个对象的成员复制到它里面。
如果不想运行构造函数,可以使用jQuery执行以下操作:
let newTypeObj:NewType = $.extend(true, Object.create(NewType.prototype), oldTypeObj);
如果你想在合并前运行新类型的构造函数,你可以这样做:
let newTypeObj:NewType = new NewType();
$.extend(true, newTypeObj, oldTypeObj);
如果你没有或不想使用jQuery,那么你可以在你的新类型中编写一个函数,该函数接受旧类型的一个实例并复制其成员,或者使用普通JavaScript编写一个泛型扩展。
这个问题有一些关于替代方案,但普遍的共识似乎是,你不能改变一个对象的类:在JavaScript中改变一个对象's类型