我尝试将现有的角度应用程序迁移到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);
}}
当我编译javascript时,我得到:
错误TS2345:类型的参数'(itemTabs:any)=> {restrict:string; compile:(tElement:any)=>无效; }'不能赋值给'any []'类型的参数。 类型'(itemTabs:any)=>中缺少属性'push' {restrict:string; compile:(tElement:any)=>无效; }”。
我试着理解为什么它在这里抱怨我去了angular的打字稿定义:
不知何故,打字稿意味着这个定义
指令(name:string,inlineAnnotatedFunction:any []):IModule;
以下定义更合适:
指令(name:string,directiveFactory:IDirectiveFactory):IModule;
我对打字稿完全不熟悉,所以我认为我做错了,但我找不到与谷歌有关的任何内容。
答案 0 :(得分:4)
我从旧的javascript angularJs 1.4.9代码迁移到typescript 2.6代码时遇到了同样的问题。我正在使用@ types / angular ver 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);
}
});
错误消失:)
答案 1 :(得分:3)
在指令中运行compile时,它必须始终返回一些内容,因此在这种情况下,添加到编译函数底部的简单return true;
将解决您的问题。
答案 2 :(得分:2)
也许你必须更新你的angular.d.ts版本,因为在the latest我可以看到:
指令(name:string,directiveFactory:IDirectiveFactory):IModule;
这将在编译后提供类似:.directive('myCustomer', function(){...}
就在旁边:
指令(name:string,inlineAnnotatedFunction:any []):IModule;
在编译后会给出类似.directive('myCurrentTime', ['$interval', 'dateFilter', function($interval, dateFilter) {...}
的内容
(它实际上在this commit中发生了变化,但很长一段时间它都是一个错误)
编辑(因为您似乎拥有angular.d.ts的最新版本)
尝试使用以下语法指示函数的返回类型:
var TabsPane = (itemTabs) : ng.IDirectiveFactory => {}