Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

549
Vistas
AOT no puede resolver todos los parámetros [...]

En primer lugar, debo decir que mi aplicación funciona bien cuando "usa" JIT. Incluso puedo agrupar en producción (sin AOT, solo JIT) y funciona bien.

Pero cuando trato de compilarlo (AOT) usando ngc , aparece un error que dice:

 Can't resolve all parameters for MyComponentView in /path/my-component/my-component.view.ts: ([object Object], [object Object], [object Object], [object Object], ?)

Este es el constructor de MyComponent :

 constructor( headerService:HeaderService, sidebarService:SidebarService, @Inject( AuthService.Token ) authService:AuthService.Class, router:Router, carbon:Carbon ) { … this.carbon = carbon; … }

La última dependencia (Carbon) se proporciona en AppModule de esta manera:

 @NgModule( { imports: [ … ], declarations: [ … ], providers: [ … CARBON_PROVIDERS, //<---- HERE IS BEING PROVIDED CARBON_SERVICES_PROVIDERS, … ], bootstrap: [ AppComponent ], } ) export class AppModule { }

Los CARBON_PROVIDERS se importan mediante el proyecto angular2-carbonldp que los exporta de esta manera:

 export const CARBON_PROVIDERS:any[] = [ { provide: Carbon, useFactory(): Context { return carbon; }, }, { provide: ContextToken, useFactory(): Context { return activeContextFn(); }, }, { provide: App.Context, useFactory(): App.Context { if( ! activeContextFn.isAppContext() ) throw new Errors.IllegalStateError( "The activeContext is not an App Context" ); return <any>activeContextFn(); }, }, ];

¡Pero termino teniendo el mismo error y no entiendo POR QUÉ! ¿Ustedes saben por qué funciona así?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Porque el compilador AOT admite solo un pequeño subconjunto de JavaScript. Este hecho está pobremente documentado, donde documentado en absoluto, y no ha sido ampliamente publicitado.

No puede analizar muchas expresiones de JavaScript dentro de los decoradores de marco Angular 2. Esto incluye llamadas a funciones que no son legales.

El siguiente código causa falla

 useFactory(): Context { return activeContextFn(); }

La razón de esto es que los decoradores angular2 bajo AOT no son decoradores en absoluto.

El compilador Angular 2 AOT mantiene una lista de decoradores conocidos que no persiste en el tiempo de ejecución, sino que los trata como nada más que anotaciones*. Esto significa que solo pueden contener expresiones constantes, referencias a nombres exportados, algunas formas de sintaxis literal de matriz y sintaxis literal de objeto que se componen de expresiones constantes, y poco más.

En caso de que se lo pregunte, sí, esto significa que ya no está escribiendo código TypeScript y, por lo tanto, ya no está escribiendo código JavaScript. Por cierto, también significa que no puede confiar en la mayoría de sus herramientas, ya que le darán luz verde para el código no válido porque no conocen el idioma.

Es un lenguaje diferente con semántica diferente y no simplemente un subconjunto porque la transformación del decorador que realiza viola la especificación para esa función en ECMAScript. Typescript no agrega ni modifica ningún comportamiento de tiempo de ejecución de ECMAScript.

* Como referencia, el término anotación se usa aquí en relación con el ahora muerto en el lenguaje @Script. Este es el lenguaje que el equipo de Angular inventó para escribir su marco y comenzó a usarlo mucho, a través de un transpilador dedicado, antes de pasar a TypeScript.

En este caso específico, creo que debe volver a escribir su fábrica de la siguiente manera:

 useFactory: contextFactory .... export function contextFactory() { return activeContextFn(); }

Es posible que esto no sea todo lo que necesita hacer y el idioma sin duda cambiará con el tiempo. Está programado para tener soporte IDE.

Aquí hay un "sandbox" bastante útil https://github.com/rangle/angular-2-aot-sandbox

Tenga en cuenta que el repositorio vinculado anteriormente no es una fuente oficial de documentación y que define su propio subconjunto en función de sus capacidades. Utilizar con precaución.

over 4 years ago · Santiago Trujillo Denunciar

0

Para cualquier otra persona que busque este texto de error específico:

Encontré este error al crear un proyecto angular principal con AOT habilitado que tenía un proyecto de biblioteca angular secundario que había empaquetado con ng-packagr, que usaba barriles internamente. Pude resolver el problema cambiando todas las referencias de barril en el proyecto de biblioteca a referencias explícitas.

Antes

 import { MyService } from './featureFolder';

Después

 import { MyService } from './featureFolder/my.service';

Enlace de problema El equipo de desarrollo afirma que esto se solucionó, pero parece haber vuelto de alguna forma en Angular 8. https://github.com/angular/angular/issues/23713

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda