Как проксировать компонент, использующий DI?

#angular #typescript #angular-dependency-injection

#angular #typescript #внедрение угловой зависимости

Вопрос:

Я пытаюсь создать прокси для компонентов Angular. Исходя из этого решения:https://github.com/Microsoft/TypeScript/issues/4890#issuecomment-141879451

В итоге я получил это:

 interface Type<T> {
  new (...args): T;
}

interface Base {}

interface Identifiable {}

export function IdentifiableSubclass<T extends Base>(SuperClass: Type<T>) {
  class C extends (<Type<Base>>SuperClass) {
    // constructor(...args) {
    //   super(...args);
    //   return new Proxy(this, {
    //     get(target, name) {
    //       return target[name];
    //     }
    //   });
    // }
  }
  return <Type<Identifiable amp; T>>C;
}
  

Использование:

 @Component({...})
class HeroesComponent {
  constructor(public heroService: HeroService) {}
}
const HeroesComponentLogged = IdentifiableSubclass(HeroesComponent);
export { HeroesComponentLogged as HeroesComponent };
  

Это работает. Проблема в том, что он завершается с ошибкой, если я раскомментирую конструктор: heroService is undefined .

Я думаю, что это как-то связано с DI от Angular, потому что следующее отлично работает на TS Playground (конструктор без комментариев):

 class HeroService {
    public sayGoodbye() {
        console.log("Goodbye");
    }
}
class HeroComponent {
     constructor(public heroService: HeroService) {
    }
}

const IdentifiedHeroComponent = IdentifiableSubclass(HeroComponent);
let identified = new IdentifiedHeroComponent(new HeroService());
identified.heroService.sayGoodbye();
  

Комментарии:

1. Я думаю, что в классе C отсутствуют метаданные декоратора из @Component() . Разве вы не получаете сообщение об ошибке при попытке добавить это в NgModule ?

2. Я думаю, вы к чему-то пришли. Как бы вы это оформили? С помощью @Component({}) я получаю TypeError: Cannot read property 'kind' of undefined . С @Injectable() я получаю Can't resolve all parameters for C: (?)