从构造函数调用的方法中为“只读”属性赋值
Assign value to `readonly` properties from methods called by the constructor
我有一个简单的 class,我想在构造函数启动的方法中为只读 属性 赋值,但它显示 [ts] Cannot assign to 'readOnlyProperty' because it is a constant or a read-only property.
为什么我不能为 属性 赋值,即使我正在从构造函数调用 process
?
示例代码:
class C {
readonly readOnlyProperty: string;
constructor(raw: string) {
this.process(raw);
}
process(raw: string) {
this.readOnlyProperty = raw; // [ts] Cannot assign to 'readOnlyProperty' because it is a constant or a read-only property.
}
}
当你创建一个单独的函数来赋值时,这个单独的函数可以从除唯一构造函数之外的其他地方使用。编译器不会检查(对于 public 函数,甚至无法检查)该函数是否仅从构造函数调用。所以报错。
无论如何,您有 2 个变通方法来分配值。更简洁的方法是将单独函数的核心放入构造函数中。另一个 会让你放松类型检查,因此不推荐 除非你真的知道你在做什么,将 this
转换为 any
:
(this as any).readOnlyProperty = raw
我通常使用这个解决方法。
private _myValue = true
get myValue (): boolean { return this._myValue }
现在您可以从 class 内部更改 属性,并且 属性 从外部是只读的。此解决方法的一个优点是您可以重构 属性 名称而不会产生错误。这就是为什么我不会使用这样的东西 (this as any).readOnlyProperty = raw
.
而不是 "casting" this as any
,您仍然可以通过仅修改此 属性:
来强制执行类型检查
(this.readOnlyProperty as string) = raw; // OK
(this.readOnlyProperty as string) = 5; // TS2322: Type '5' is not assignable to type 'string'.
很老的问题,但我认为仍然值得分享我通常是如何克服这个问题的。我倾向于 return 你想从方法中设置的值,然后你仍然在分离逻辑,同时还保持只读,没有任何可以说是非法的绕过。例如...
class C {
readonly readOnlyProperty: string;
constructor(raw: string) {
this.readOnlyProperty = this.process(raw);
}
process(raw: string) {
// ...some logic that processes 'raw'...
return raw;
}
}
我有一个简单的 class,我想在构造函数启动的方法中为只读 属性 赋值,但它显示 [ts] Cannot assign to 'readOnlyProperty' because it is a constant or a read-only property.
为什么我不能为 属性 赋值,即使我正在从构造函数调用 process
?
示例代码:
class C {
readonly readOnlyProperty: string;
constructor(raw: string) {
this.process(raw);
}
process(raw: string) {
this.readOnlyProperty = raw; // [ts] Cannot assign to 'readOnlyProperty' because it is a constant or a read-only property.
}
}
当你创建一个单独的函数来赋值时,这个单独的函数可以从除唯一构造函数之外的其他地方使用。编译器不会检查(对于 public 函数,甚至无法检查)该函数是否仅从构造函数调用。所以报错。
无论如何,您有 2 个变通方法来分配值。更简洁的方法是将单独函数的核心放入构造函数中。另一个 会让你放松类型检查,因此不推荐 除非你真的知道你在做什么,将 this
转换为 any
:
(this as any).readOnlyProperty = raw
我通常使用这个解决方法。
private _myValue = true
get myValue (): boolean { return this._myValue }
现在您可以从 class 内部更改 属性,并且 属性 从外部是只读的。此解决方法的一个优点是您可以重构 属性 名称而不会产生错误。这就是为什么我不会使用这样的东西 (this as any).readOnlyProperty = raw
.
而不是 "casting" this as any
,您仍然可以通过仅修改此 属性:
(this.readOnlyProperty as string) = raw; // OK
(this.readOnlyProperty as string) = 5; // TS2322: Type '5' is not assignable to type 'string'.
很老的问题,但我认为仍然值得分享我通常是如何克服这个问题的。我倾向于 return 你想从方法中设置的值,然后你仍然在分离逻辑,同时还保持只读,没有任何可以说是非法的绕过。例如...
class C {
readonly readOnlyProperty: string;
constructor(raw: string) {
this.readOnlyProperty = this.process(raw);
}
process(raw: string) {
// ...some logic that processes 'raw'...
return raw;
}
}