使用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制作对象类具有抽象方法的对象副本时如何解决错误?的主要内容,如果未能解决你的问题,请参考以下文章