Допустимо ли переопределять свойство в базовом классе JavaScript/TypeScript с помощью пары геттер/сеттер в подклассе?

#javascript #typescript #overriding #getter #setter

Вопрос:

Недавно в TypeScript появилась ошибка компиляции, когда пользователь пытается переопределить свойство в базовом классе с помощью пары геттер/сеттер (расширение доступа к свойствам):

 class BaseClass {
    prop        : string        = 'base_class'
}

class SubClass extends BaseClass {
    _prop       : string        = 'sub_class'

    /*
       ERROR: 'prop' is defined as a property in class 'BaseClass', but is overridden here in 'SubClass' as an accessor.
    */
    get prop () : string {
        return this._prop
    }
    set prop (value : string) {
        this._prop = value
    }
}
// try running this snippet with `useDefineForClassFields : true` and `useDefineForClassFields : false`
console.log((new SubClass).prop)
 

Эта ошибка вызвана тем фактом, что в современном JavaScript поля классов имеют семантику [[ОПРЕДЕЛИТЬ]], и приведенный выше пример не будет работать так, как интуитивно ожидалось, если useDefineForClassFields для параметра компилятора установлено значение true .

Шаблон расширения доступа к свойствам

Необходимо отметить, что исторически никто никогда не использовал семантику ОПРЕДЕЛЕНИЯ для свойств класса. Почти весь код JavaScript и машинописи в мире в настоящее время предполагает заданную семантику для полей классов.

Шаблон расширения доступа к свойствам идеально подходит для набора семантики. Его очень идиоматичный JavaScript. Его основным вариантом использования является запуск некоторого произвольного кода при чтении/записи свойств. Это очень полезно для различных целей и достигается простым переопределением свойства базового класса с помощью пары методов доступа getter/setter.

TypeScript и JavaScript исторически использовали заданную семантику для полей классов. После того, как была введена семантика ОПРЕДЕЛЕНИЯ, TypeScript добавил новую конфигурацию компилятора useDefineForClassFields , которая управляет семантикой полей класса и по умолчанию отключена, поскольку это критическое изменение.

вопросы:

  1. Считаете ли вы, что шаблон расширения доступа к свойствам допустим и должен поддерживаться TypeScript, когда семантика поля класса [[Задана]] ( useDefineForClassFields=false что является значением по умолчанию)
  2. Используете ли вы этот шаблон в своей кодовой базе JavaScript/TypeScript? Если да, пожалуйста, приведите пример использования в качестве ответа.

См. Также: Предложение ограничить ошибку компиляции только определением семантики