usar suscribe sincrono promesas peticiones como asincronas angularjs typescript typescript2.0

angularjs - suscribe - Después de actualizar TypeScript, el registro del controlador angular ahora no se puede compilar



promesas angularjs (2)

Dado que todas las propiedades de IController son opcionales, creo que los errores que está viendo son el resultado de la nueva comprobación de "Tipos débiles" en TypeScript 2.4. Verifique este enlace de Microsoft para más detalles. También verifica este problema relacionado con Github .

Algunas citas relevantes de Microsoft:

En TypeScript 2.4, estamos agregando un cheque similar para lo que llamamos tipos débiles. Cualquier tipo que contiene solo propiedades opcionales se considera un tipo débil ya que proporciona pocas restricciones sobre lo que se le puede asignar.

...

En TypeScript 2.4, ahora es un error asignar algo a un tipo débil cuando no hay superposición en las propiedades.

...

Puede pensar en esto como que TypeScript "endurece" las débiles garantías de estos tipos para captar lo que de otra manera serían errores silenciosos.

Como se trata de un cambio radical, es posible que deba conocer las soluciones provisionales que son las mismas que las de las verificaciones literales de objetos estrictas:

  1. Declara las propiedades si realmente existen.
  2. Agregue una firma de índice al tipo débil (es decir, [propName: string]: {}).
  3. Use una aserción de tipo (es decir, opta como Opciones).

Editar: Según esta información, una solución simple sería implementar uno de los métodos definidos en IController . Por ejemplo, como menciona @Amy en los comentarios, puedes definir un método $onInit vacío en tu controlador.

Editar: para completar, aquí está el código completo:

export class TopMenuController implements angular.IController { static $inject = ["$templateCache", "Restangular"]; $onInit() { } constructor( private readonly $templateCache: angular.ITemplateCacheService, private readonly restangular: Restangular.IElement) { } }

Estábamos usando TypeScript 2.2. Después de actualizar a 2.4, ahora obtenemos esto en compilación:

error TS2345: El argumento de tipo ''typeof TopMenuController'' no se puede asignar al parámetro de tipo ''Injectable <IControllerConstructor>''. El tipo ''typeof TopMenuController'' no se puede asignar al tipo ''(string | (new (... args: any []) => IController) | ((... args: any []) => void | IController)) [ ] ''. La propiedad ''push'' falta en el tipo ''typeof TopMenuController''.

ts / controllers / TopMenuController.ts (2,18): error TS2559: Escriba ''TopMenuController'' no tiene propiedades en común con el tipo ''IController''.

No entiendo el primer error y Google ha sido difícil. Solo estoy pidiendo ayuda con el primer error. (Recibo el segundo error debido a mis intentos de resolver el primero). Aquí está el controlador:

export class TopMenuController implements angular.IController { static $inject = ["$templateCache", "Restangular"]; constructor( private readonly $templateCache: angular.ITemplateCacheService, private readonly restangular: Restangular.IElement) { } }

Y así es como está registrado.

angular.module("ngApp") .config(Configuration.TemplateCacheConfigurator) .controller("topMenuController", Controllers.TopMenuController)

¿Cómo modifico la definición de mi controlador o su registro para que nuestro código compile de nuevo?

(Extracción de los implements angular.IController bit de implements angular.IController elimina el segundo error, pero el primero permanece)

Editar: Encontré este error


También me enfrenté al mismo problema que resolví por

  • implementando IController

  • agregue este código antes del constructor ( o en cualquier lugar del código esta es mi preferencia ) $onInit = () => { };

aquí está el código completo, espero que esto dé una vista clara

module MyApp { export class HomeController implements angular.IController { $onInit = () => { }; user: string; constructor() { this.user = "mali"; } } angular.module(''app'').controller(''homeController'', MyApp.HomeController) }

Happy Coding