TypeScript - присваивать значение «readonly» свойствам из методов, вызываемых конструктором - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть простой класс, и я хочу присвоить значение свойству 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.
    }
}

Ответы [ 3 ]

0 голосов
/ 14 марта 2019

Обычно я использую этот обходной путь.

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

Теперь вы можете изменить свойство внутри класса, а свойство доступно только для чтения извне.Одним из преимуществ этого обходного пути является то, что вы можете реорганизовать имена своих свойств без возникновения ошибок.Вот почему я бы не стал использовать что-то подобное (this as any).readOnlyProperty = raw.

0 голосов
/ 09 апреля 2019

Вместо «приведения» this as any вы все равно можете принудительно проверять тип, изменяя только это свойство:

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

0 голосов
/ 21 сентября 2018

Когда вы создаете отдельную функцию для присвоения значения, эту отдельную функцию можно использовать где-то еще, кроме единственного конструктора.Компилятор не будет проверять (а для публичной функции даже не сможет проверить), что функция вызывается только из конструктора.Так что ошибка.

У вас есть 2 обходных пути для назначения значения в любом случае.Более чистым было бы поместить ядро ​​вашей отдельной функции в конструктор.Другой, который заставит вас потерять проверку типов и поэтому не рекомендуется , если вы действительно не знаете, что делаете, будет конвертировать this в any:

(this as any).readOnlyProperty = raw
...