#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
, которая управляет семантикой полей класса и по умолчанию отключена, поскольку это критическое изменение.
вопросы:
- Считаете ли вы, что шаблон расширения доступа к свойствам допустим и должен поддерживаться TypeScript, когда семантика поля класса [[Задана]] (
useDefineForClassFields=false
что является значением по умолчанию) - Используете ли вы этот шаблон в своей кодовой базе JavaScript/TypeScript? Если да, пожалуйста, приведите пример использования в качестве ответа.
См. Также: Предложение ограничить ошибку компиляции только определением семантики