2015-12-28 4 views
4

Этот фрагмент кода транслируется с 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?

ответ

4

Я был в состоянии сделать машинопись молчать с

class ParentClass { 
    static staticProp = true; 

    method() { 
     console.log((<typeof ParentClass>this.constructor).staticProp); 
    } 
} 
4

Если вы готовы пожертвовать проверки типов, вы можете избавиться от ошибки компилятора машинописи путем индексации свойства:

console.log(this.constructor["staticProp"]); 
7

машинописи поддерживает только ClassName.staticPropertyName синтаксиса в данный момент. Существует, однако, an open issue с просьбой о его упрощении.

Вы также можете обернуть свой staticProp в геттер. Это громоздко, но по крайней мере, он не чувствует, как язык хака:

class ParentClass { 
    static staticProp = true; 

    method() { 
     console.log(this.staticProp); 
    } 

    get staticProp(): boolean { return ParentClass.staticProp; } 
} 

class ChildClass extends ParentClass { 
    static staticProp = false; 

    get staticProp(): boolean { return ChildClass.staticProp; } 
} 

(new ChildClass).method(); 
+0

Да, это выглядит неуклюжим, но интересно. Я надеялся, что для решения этой проблемы можно применить магию какого-то типа. – estus

+0

Ну, проблема в том, что если вы идете с решением @pmcoltrane, вы теряете информацию о типе. Вы можете сделать 'let p = this.constructor [" staticProp "] как boolean', но таким образом вы укажете тип дважды, и если вы выполните некоторый рефакторинг, вы можете получить сообщение об ошибке. Так что есть плюсы и минусы. Было бы здорово иметь ключевое слово self, но, к сожалению, оно не поддерживается. Это также причина, по которой я буду использовать геттеры (даже если они неуклюжи), потому что моя IDE может контролировать мой код, и вероятность появления ошибки будет ниже. –

+0

Спасибо, тип assertion оказался очень хорошей идеей, на самом деле (я даже не знал синтаксиса 'as' assertion). Мне все еще не достаточно удобно с функциями ввода TS, но я ожидаю, что с помощью интерфейса я пригворю его правильно. – estus

Смежные вопросы