为什么我在指令定义上得到错误TS2345?

Dav*_*ang 8 angularjs typescript typescript1.5

我尝试将现有的角度应用程序迁移到typescript(版本1.5.3):

这是代码:

  'use strict';
    angular.module('x')
    .directive('tabsPane', TabsPane)

    function TabsPane(itemTabs) {

        return {
            restrict: 'E',
            compile: compileTabs
        };

        function compileTabs(tElement) {
            var template = createTabsTemplate(); //function which i don't include here for brevity
            tElement.append(template);
        }}
Run Code Online (Sandbox Code Playgroud)

当我编译javascript我得到:

错误TS2345:类型的参数'(itemTabs:any)=> {restrict:string; compile:(tElement:any)=> void; }'不能赋值给'any []'类型的参数.类型'(itemTabs:any)=> {restrict:string; compile:(tElement:any)=> void; }".

我试着理解为什么它在这里抱怨我去了angular的typescript定义:

不知何故,打字稿暗示了这个定义

指令(name:string,inlineAnnotatedFunction:any []):IModule;

以下定义更合适:

指令(name:string,directiveFactory:IDirectiveFactory):IModule;

我对打字稿完全不熟悉,所以我认为我做错了,但我找不到任何与谷歌有关的东西.

Wie*_*Pie 5

我在从旧的 javascript angularJs 1.4.9 代码迁移到 typescript 2.6 代码时遇到了同样的问题。我正在使用 @types/angular 1.6.39 版。我添加了“any”作为参数函数的返回类型,例如:

    angular.module("app")
      .directive("tabsPane", function TabsPane(itemTabs): any { 
            return {
                restrict: 'E',
                compile: compileTabs
            };

            function compileTabs(tElement) {
                var template = createTabsTemplate();
                tElement.append(template);
            }
       });
Run Code Online (Sandbox Code Playgroud)

错误消失了:)


deK*_*joo 2

也许你必须更新你的 angular.d.ts 版本,因为在最新版本中我可以看到:

指令(名称:字符串,directiveFactory:IDirectiveFactory):IModule;

这将给出类似的内容:.directive('myCustomer', function(){...}一旦编译

就在:

指令(名称:字符串,inlineAnnotatedFunction:任何[]):IModule;

这将给出类似.directive('myCurrentTime', ['$interval', 'dateFilter', function($interval, dateFilter) {...}曾经编译过的东西(它实际上在这次提交中发生了变化,但它是一个很长一段时间的错误)

编辑(因为你似乎拥有最新版本的 angular.d.ts)

尝试使用以下语法指示函数的返回类型:

var TabsPane = (itemTabs) : ng.IDirectiveFactory => {}