如何在 TypeScript 中合并类实例?

问题描述 投票:0回答:2

我有一堂这样的课:

class Person {
    private _age: number;

    get age(): number {
        return this._age;
    }

    set age(value: number) {
        this._age = value;
    }
}

以及该类的一个实例:

let peter = new Person();
peter.age = 30;

我想通过简单地使用扩展运算符来获得该类的另一个实例:

let marc = {
    ...peter,
    age: 20
}

但这不会产生

Person
的实例,而是产生没有
Person
的 getter 和 setter 的对象。

是否可以以某种方式合并类实例,或者我是否需要再次使用

new Person()
来实现
mark

javascript typescript copy instance
2个回答
4
投票

Spread 语法应该生成普通对象,因此它不适用。如果需要新的类实例,应该使用

new
创建它。如果一个对象必须与其他属性合并,可以使用
Object.assign

let marc = Object.assign(
    new Person()
    peter,
    { age: 20 }
);

由于

Object.assign
处理自己的可枚举属性,因此结果可能是不期望的或意外的,具体取决于类内部;它将从
_age
复制私有
age
但不复制公开
peter

在任何特殊情况下,类都应该实现像

clone
这样的实用方法,它了解类内部并正确创建实例。


0
投票

用 OOP 术语来说,创建实例后无需定义属性,而是在

class

中定义它们

在您的示例中,马克和彼得都有年龄,因此您不需要合并任何内容。您可以使用构造函数为该实例传递特定值:

let marc = new Person("marc", 20)
let peter = new Person("peter", 30)

class Person {
    constructor(private name:string, private age:number){
       console.log("I am " + this.name + " my age is " + this.age)
    }
}

如果有一个属性除了 Marc 之外没有人拥有,那么你可以让 Marc 扩展 Person。

class Person {

}

class Marc extends Person {
    car:string
}
© www.soinside.com 2019 - 2024. All rights reserved.