gpt4 book ai didi

typescript - 包含只读对象的扩展运算符

转载 作者:行者123 更新时间:2023-12-05 03:28:59 24 4
gpt4 key购买 nike

我的示例类:

class Foo {
private static counter = 1;

readonly id: number;

constructor() {
this.id = Foo.counter++;
}
}

我有两个选择:

  • 让构造函数接受另一个 Foo,这样我就可以使用 new Foo(foo)
  • 进行克隆
  • 公开 id,这样我就可以使用 { ...foo } 克隆

有没有办法使用 spread clone 并保持 readonly(或任何防止 id 从外部修改的东西)?

最佳答案

Is there anyway to use spread clone AND keep readonly...

没有。 { ...foo } 的结果是一个普通对象,具有读/写公共(public)数据属性,用于 foo 自己的可枚举属性。您无法向类(class)添加任何内容来改变这种行为。

另请注意,因为 { ...foo } 创建了一个普通对象,它不再是 Foo 的实例。例如,如果 Foo 定义了任何方法,克隆就不会拥有它们。 (在问题的代码中,这种克隆将与 Foo 赋值兼容,因为它定义任何方法。但是如果 Foo 有方法,但不会。)

如果你想使用扩展语法(它不是运算符)来克隆对象,不要使用class,使用interface,因为克隆不会继承类将分配的原型(prototype)。

在这种情况下,如您所说,您可以将 Foo 的构造函数设为可选的复制构造函数:

class Foo {
private static counter = 1;

readonly id: number;

constructor(other?: Foo) {
if (other) {
// Copying
this.id = other.id; // Just to make TypeScript happy that `id` is
// definitely assigned on this path (it would be
// anyway, but TypeScript doesn't know that)
Object.assign(this, other);
} else {
// Creating a new one
this.id = Foo.counter++;
}
}
}

(而不是 this.id = other.id; 行,我们可以用“明确分配”注释标记 id [readonly id!: number;]。但由于构造函数有多个路径,我不会这样做,因为在修改代码时很容易忘记它。所以我会使用上面不必要的分配。)

关于typescript - 包含只读对象的扩展运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71103732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com