Этот фрагмент кода транслируется с Babel и TypeScript и работает как ожидалось.Использование статического свойства в методе унаследованного класса
class ParentClass {
static staticProp = true;
method() {
console.log(this.constructor.staticProp);
}
}
class ChildClass extends ParentClass {
static staticProp = false;
}
(new ChildClass).method();
Требования здесь, чтобы обратиться к статическому свойству текущего класса (через this.constructor
) вместо того, чтобы упомянуть класс явно, так что метод может быть унаследован и использовать соответствующие статические свойства в дочерних классах.
Это нормально для Бабеля, и машинопись компилирует его, как хорошо, но он бросает
ошибка TS2339: Свойство «staticProp» не существует на типе «Function».
сверху сборник.
Как можно обработать этот случай с помощью компилятора TypeScript?
Да, это выглядит неуклюжим, но интересно. Я надеялся, что для решения этой проблемы можно применить магию какого-то типа. – estus
Ну, проблема в том, что если вы идете с решением @pmcoltrane, вы теряете информацию о типе. Вы можете сделать 'let p = this.constructor [" staticProp "] как boolean', но таким образом вы укажете тип дважды, и если вы выполните некоторый рефакторинг, вы можете получить сообщение об ошибке. Так что есть плюсы и минусы. Было бы здорово иметь ключевое слово self, но, к сожалению, оно не поддерживается. Это также причина, по которой я буду использовать геттеры (даже если они неуклюжи), потому что моя IDE может контролировать мой код, и вероятность появления ошибки будет ниже. –
Спасибо, тип assertion оказался очень хорошей идеей, на самом деле (я даже не знал синтаксиса 'as' assertion). Мне все еще не достаточно удобно с функциями ввода TS, но я ожидаю, что с помощью интерфейса я пригворю его правильно. – estus