Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Angular 2+: Ошибка при добавлении метода в декораторе класса (https://javascript.ru/forum/angular/69989-angular-2-oshibka-pri-dobavlenii-metoda-v-dekoratore-klassa.html)

Shitbox2 01.08.2017 20:08

Angular 2+: Ошибка при добавлении метода в декораторе класса
 
class Base {

}

function addGet () {
  return (target: any) => {
    const original = target;

    const constructor : any = function (...args) {
      this.get = function () {
        console.log('GET METHOD');
      }
    };
    constructor.prototype = original.prototype;

    return constructor;
  };
}

@addGet()
class ExtendedBase extends Base {

}

(new ExtendedBase()).get(); //Error: TS2339: Property 'get' does not exist on type 'GlbServersResource'.


IDEA и компилятор ругаются, что метод get не объявлен, хотя он добавляется в декораторе и код отлично работает. Это бага компилятора или что-то криминальное делаю? Как это обойти?

P.S. Добавлять метод в тело ExtendedBase и использовать декораторы методов не предлагать

destus 02.08.2017 06:49

(new ExtendedBase() as any).get();

Shitbox2 02.08.2017 11:31

Спасибо! Как-то даже не подумал о таком способе) Тут, кстати, бурное обсуждение идет по этому поводу, народ тоже возмущается.

Еще вопрос сопутствующий. В JS можно динамически создать класс? Не по-старинке, сгенерировав прототип, а используя новый синтаксис class MyClass {}?

destus 02.08.2017 12:08

Shitbox2,
Цитата:

В JS можно динамически создать класс?
выполнять eval в global scope
<script>
var txt = `var c = class SomeClass {constructor() {this.text = 'blabla'}}`;
eval.call(this, txt);
console.log(new c());
</script>

Shitbox2 02.08.2017 15:31

Ну с eval'ом-то всё можно)


Часовой пояс GMT +3, время: 10:00.