Подтвердить что ты не робот

После обновления TypeScript регистрация Angular контроллера не скомпилируется

Мы использовали TypeScript 2.2. После обновления до 2.4 мы теперь получаем это на компиляции:

error TS2345: Аргумент типа 'typeof TopMenuController' не присваивается параметру типа 'Injectable <IControllerConstructor> '.   Тип 'typeof TopMenuController' не присваивается типу '(string | (new (... args: any []) = > IController) | ((... args: any []) = > void | IController) ) [] ".     Свойство" push "отсутствует в типе" typeof TopMenuController".

ts\controllers\TopMenuController.ts(2,18): ошибка TS2559: Тип 'TopMenuController' не имеет общих свойств с типом 'IController'.

Я не понимаю первую ошибку, и Googling это было сложно. Я только прошу помощи с первой ошибкой. (Я получаю вторую ошибку из-за моих попыток разрешить первое). Здесь контроллер:

export class TopMenuController implements angular.IController {
    static $inject = ["$templateCache", "Restangular"];

    constructor(
        private readonly $templateCache: angular.ITemplateCacheService,
        private readonly restangular: Restangular.IElement) {
    }
}

И вот как он зарегистрирован.

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

Как изменить определение контроллера или его регистрацию, чтобы наш код снова скомпилировался?

(Удаление бита implements angular.IController удаляет вторую ошибку, но первая остается)

Изменить: Я нашел эту ошибку

4b9b3361

Ответ 1

Так как все свойства IController являются необязательными, я считаю, что ошибки, которые вы видите, являются результатом новой проверки "слабых типов" в TypeScript 2.4. Для получения дополнительной информации см. эту ссылку от Microsoft. Также проверьте эту связанную проблему Github.

Некоторые релевантные цитаты из Microsoft:

В TypeScript 2.4 добавили аналогичную проверку для того, что мы называем слабым типы. Любой тип, содержащий только дополнительные свойства, считается слабый тип, поскольку он предоставляет несколько ограничений на то, что можно назначить к нему.

...

В TypeScript 2.4, теперь это ошибка, чтобы присваивать что-либо слабому типу когда они не перекрываются в свойствах.

...

Вы можете думать об этом как TypeScript "ужесточение" слабых гарантии этих типов поймать то, что в противном случае было бы тихим ошибки.

Поскольку это измененное изменение, вам может потребоваться узнать о обходные пути, которые являются теми же, что и для строкового объектного литерала проверки:

  • Объявить свойства, если они действительно существуют.
  • Добавьте индексный знак к слабому типу (т.е. [propName: string]: {}).
  • Используйте утверждение типа (т.е. выбирает опции).

Изменить:. На основе этой информации простым решением было бы реализовать один из методов, определенных в IController. Например, как упоминалось в комментариях @Amy, вы можете просто определить пустой метод $onInit в вашем контроллере.

Изменить:. Для полноты здесь полный код:

export class TopMenuController implements angular.IController {
  static $inject = ["$templateCache", "Restangular"];

  $onInit() { }

  constructor(
      private readonly $templateCache: angular.ITemplateCacheService,
      private readonly restangular: Restangular.IElement) {
  }
}

Ответ 2

Я также столкнулся с той же проблемой, с которой я столкнулся

  • внедряя IController

  • добавить этот код перед конструктором (или где-нибудь в коде, это мои предпочтения) $onInit =() => { };

вот полный код, надеюсь, это даст четкое представление

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

Счастливое Кодирование

Ответ 3

добавление следующего кода устранило проблему

$onInit = () => { };