TypeScript-从构造函数调用的方法中为`readonly`属性分配值

时间:2018-09-21 05:22:42

标签: typescript class constructor readonly-attribute

我有一个简单的类,我想在构造函数发起的方法中为只读属性分配一个值,但是它说[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.
    }
}

3 个答案:

答案 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'.