【问题标题】:How to get around the error when using Spread to make an object copy where the object class has abstract methods?使用Spread制作对象类具有抽象方法的对象副本时如何解决错误?
【发布时间】: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 我没有。我避开了它。仍然希望有一个可行的解决方案。

标签: typescript spread-syntax


【解决方案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 在设计上失败了,因为扩展语法不会复制类实例方法等不可枚举的属性。
    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 2021-11-03
    相关资源
    最近更新 更多