使用Spread制作对象类具有抽象方法的对象副本时如何解决错误?

Posted

技术标签:

【中文标题】使用Spread制作对象类具有抽象方法的对象副本时如何解决错误?【英文标题】:How to get around the error when using Spread to make an object copy where the object class has abstract methods? 【发布时间】:2019-03-23 22:16:37 【问题描述】:

在下面的代码中,我有一个抽象类,它需要扩展类来实现抽象方法。使用“spread”语法时,它抱怨缺少抽象方法的实现。

abstract class Test 
    abstract func(): void;


class Test1 extends Test 
    func(): void 


function funcTest(): void 
    const test1: Test = new Test1();
    const test: Test = ...test1;

如何使用 spread 来复制具有抽象方法的类对象?如果不能,有办法解决吗?

示例代码如下:https://stackblitz.com/edit/typescript-zuryyw

【问题讨论】:

这是一个打字稿问题,不是角度问题,对吧? 我认为这与传播无关。传播之前的行 new Test(); 已经是非法的,因为你不能实例化一个抽象类。 @chiliNUT 这只是一个错字。它创建一个 Test1 的实例,然后使用 spread 复制并转换为 Test。 @DaleBurrell 将打字稿添加到标签中。我来自 Angular 世界,从来不知道它是打字稿的一部分。谢谢。 @DaleBurrell 我没有。我避开了它。仍然希望有一个可行的解决方案。 【参考方案1】:

Object.assign 将对自己的属性和方法做一个浅拷贝,所以应该在这里做这个技巧。

https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Object/assign

但是,如果您的实际代码更复杂,则可能需要多种方法的组合。我建议谷歌在 javascript 中复制对象。

https://scotch.io/bar-talk/copying-objects-in-javascript

【讨论】:

【参考方案2】:

根据定义,您不能创建抽象类的实例 - 无论您使用哪种机制。

根据评论进行编辑

Spread 将创建一个新对象,它的类型不是Test,因此分配给Test 类型的变量将基于它具有相同的属性和方法。

当你从Test 中删除func 时,你可以做到这一点,但是当它在那里时你不能这样做,因为由spread 创建的对象不具有Test 的所有属性和方法。

【讨论】:

也不是哪种语言 对不起,只是一个错字。它创建一个 Test1 的实例,然后使用 spread 复制并转换为 Test。 第 2 行仍在尝试创建 Test 的实例,这是不可能的。 @DaleBurrell 不,这是完全有效的。这是一个例子:stackblitz.com/edit/typescript-zuryyw 我认为最重要的一点是 TypeScript 在设计上失败了,因为扩展语法不会复制类实例方法等不可枚举的属性。

以上是关于使用Spread制作对象类具有抽象方法的对象副本时如何解决错误?的主要内容,如果未能解决你的问题,请参考以下文章

java克隆对象clone()的使用方法和作用

五. 面向对象高级特性5. 接口和抽象类的区别

.NET中制做对象的副本

具有抽象类的 C++11 对象组合

Java 类和对象抽象类

Java Review (十面向对象----抽象类)