update the needs instead greater found error compiler cli cannot but and actualizar angular angular-compiler-cli

the - update typescript angular



El compilador Angular 4 AOT no soporta mixins (2)

Consulte https://github.com/angular/angular/issues/19145

Creo que es el mismo problema. La herencia del decorador se rompe para los mixins, por lo que actualmente tendrá que duplicar propiedades decoradas.

A veces uso Mixins para inyectar funciones repetidas como slugUrl() .

Pero no funciona con compilador angular 4.

export function Mixin(decorators: Function[]) { return function (classFn: Function) { decorators.forEach(decorator => { Object.getOwnPropertyNames(decorator.prototype).forEach(name => { classFn.prototype[name] = decorator.prototype[name]; }); }); }; } @Mixin([BehaviorInjected]) export class FooComponent { }

Si compilo este código, el compilador arroja:

La propiedad ''ngClassControl'' no existe en el tipo ''FooComponent''.

¿Algunas ideas?

Edición: dado que hubo alguien que preguntó, aquí hay otro ejemplo que usa mixins TS que reproduce el problema, esta vez a nivel de plantilla.

Componentes:

@Component({ selector: ''home-page'', template: ''<test [tag]="tag"></test>'' }) export class HomePageComponent extends TaggedComponent(MyComponent) { public tag = ''hi there''; } @Component({ selector: ''test'', template: ''<div></div>'' }) export class TestComponent extends TaggedComponent(MyComponent) {}

Mixins:

type Constructor<T> = new(...args: any[]) => T; export function TaggedComponent<T extends Constructor<{}>>(Base: T) { class TaggedBase extends Base { @Input() tag: string; }; return TaggedBase; } export class MyComponent { protected subscriptions: Subscription = new Subscription(); // ... }

Error:

ERROR en error: errores de análisis de plantilla: no se puede enlazar a ''etiqueta'' ya que no es una propiedad conocida de ''prueba''. ("] [tag] =" tag ">")


El principal problema aquí es que el compilador angular tiene una funcionalidad limitada (lea más en los documentos )

El compilador AOT utiliza metadatos generados por MetadataCollector. Utiliza el modelo de objeto mecanografiado (árbol de Node ) ( es por eso que AOT solo se puede usar con ngfactory ) para recopilar toda la información necesaria para producir ngfactory (en algunos casos también ngsummary ).

Los ejemplos que proporcionaste son completamente diferentes para el compilador AOT:

1) decorador personalizado

@Mixin([BehaviorInjected]) export class FooComponent {}

Angular MetadataCollector incluirá @Mixin decorator en los metadatos del símbolo FooComponent (elemento en la matriz de decorators ), pero se omitirá cuando aot StaticReflector llamará a simplify ya que el decorador Mixin no está registrado en un mapa especial que incluya solo decoradores estrictamente definidos ( código fuente )

Además, si incluso lo incluimos en ese mapa, aún no se ejecutará durante una compilación porque no está disponible solo para decoradores admitidos.

2) llamar a la función personalizada

export class HomePageComponent extends TaggedComponent(MyComponent) {

MetadataCollector agregará TaggedComponent a la colección de metadatos como un símbolo como {__symbolic: ''error'', message: ''Symbol reference expected''}; pero también se saltará dentro de StaticReflector .

Y por lo que sé, actualmente no hay una solución que lo respalde.