我有一个简单的类,我想在构造函数发起的方法中为只读属性分配一个值,但是它说[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.
}
}
答案 0 :(得分:1)
创建单独的函数来分配值时,可以从单独的构造函数之外的其他地方使用此单独的函数。编译器将不会检查(对于公共函数,甚至无法检查)该函数仅从构造函数中调用。所以是错误。
无论如何,您有2种解决方法来分配值。更干净的方法是将单独函数的核心放入构造函数中。另一个会让您松开类型检查,因此不推荐使用,除非您真的知道自己在做什么,否则将this
转换为any
:>
(this as any).readOnlyProperty = raw
答案 1 :(得分:1)
我通常使用这种解决方法。
private _myValue = true
get myValue (): boolean { return this._myValue }
现在,您可以在类中更改属性,并且该属性从外部是只读的。这种解决方法的一个优点是,您可以重构属性名称而不会产生错误。这就是为什么我不会使用类似(this as any).readOnlyProperty = raw
的原因。
答案 2 :(得分:0)
除了“ casting” this as any
之外,您仍然可以通过仅修改以下属性来强制执行类型检查:
(this.readOnlyProperty as string) = raw; // OK
(this.readOnlyProperty as string) = 5; // TS2322: Type '5' is not assignable to type 'string'.