web-dev-qa-db-ja.com

コンストラクターによって呼び出されたメソッドから `readonly`プロパティに値を割り当てます

単純なクラスがあり、コンストラクターによって開始されたメソッドの読み取り専用プロパティに値を割り当てたいのですが、[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.
    }
}
4
Bill

私は通常、この回避策を使用します。

  private _myValue = true
  get myValue (): boolean { return this._myValue }

これで、クラス内からプロパティを変更でき、プロパティは外部から読み取り専用になります。この回避策の利点の1つは、エラーを生成せずにプロパティ名をリファクタリングできることです。だから私はこのようなものを使わないでしょう(this as any).readOnlyProperty = raw

3
Jan

「キャスト」の代わりにthis as any、このプロパティだけを変更することで、型チェックを強制できます。

(this.readOnlyProperty as string) = raw; // OK
(this.readOnlyProperty as string) = 5;   // TS2322: Type '5' is not assignable to type 'string'.

2
Michael Chen

値を割り当てるために別の関数を作成する場合、この別の関数は、唯一のコンストラクター以外の場所から使用できます。コンパイラーは、関数がコンストラクターからのみ呼び出されていることをチェックしません(また、パブリック関数の場合はチェックすることさえできません)。だからエラー。

とにかく値を割り当てるための2つの回避策があります。よりクリーンなのは、個別の関数のコアをコンストラクターに配置することです。もう1つは、型チェックが失われるため、お勧めしませんthisanyに変換することを本当に理解していない限り、次のようになります。

(this as any).readOnlyProperty = raw
1