升级TypeScript后,Angular控制器注册现在无法编译

时间:2017-06-28 13:29:50

标签: angularjs typescript typescript2.0

我们使用的是TypeScript 2.2。升级到2.4之后,我们现在在编译时得到这个:

  

错误TS2345:类型'类型TopMenuController'的参数不能分配给' Injectable< IControllerConstructor>'类型的参数。     键入' typeof TopMenuController'不能分配给类型'(字符串|(new(... args:any [])=> IController)|((... args:any [])=> void | IController))[ ]&#39 ;.       物业'推动'类型' typeof TopMenuController'中缺少。

     

ts \ controllers \ TopMenuController.ts(2,18):错误TS2559:输入' TopMenuController'没有与类型' IController'。

相同的属性

我不理解第一个错误,谷歌搜索一直很困难。我只是要求第一个错误的帮助。 (由于我试图解决第一个错误,我得到了第二个错误)。这是控制器:

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位会删除第二个错误,但第一个错误仍然存​​在)

修改:我找到了this bug

3 个答案:

答案 0 :(得分:40)

由于IController的所有属性都是可选的,我相信您看到的错误是TypeScript 2.4中新的“弱类型”检查的结果。有关详细信息,请查看this link from Microsoft。另请查看this related Github issue

微软的一些相关引言:

  

在TypeScript 2.4中,我们为我们称之为弱的内容添加了类似的检查   类型。任何仅包含可选属性的类型都被视为a   弱类型,因为它对可以分配的内容提供的限制很少   它。

...

  

在TypeScript 2.4中,将任何内容分配给弱类型现在都是错误的   当属性没有重叠时。

...

  

你可以把它想象成TypeScript“强化”弱者   保证这些类型能够捕获原本会沉默的东西   错误。

     

由于这是一个重大变化,您可能需要了解相关信息   变通办法与严格的对象文字相同   检查:

     
      
  1. 如果属性确实存在,则声明属性。
  2.   
  3. 为弱类型添加索引签名(即[propName:string]:{})。
  4.   
  5. 使用类型断言(即选择选项)。
  6.   

编辑:根据这些信息,一个简单的解决方案就是实现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) {
  }
}

答案 1 :(得分:7)

我也遇到过与

解决的问题相同的问题
  • 实施IController

  • 在构造函数之前添加此代码(或代码中的任何位置,这是我的偏好$onInit = () => { };

这里是完整的代码,希望这会给出一个清晰的视图

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

快乐编码

答案 2 :(得分:0)

添加以下代码可解决此问题

$onInit = () => { };