这对我有用:
在一个单独的文件中,我declare module app:
// IRootScopeService.d.ts
declare module app {
interface IRootScopeService extends ng.IRootScopeService {
//
$state: ng.ui.IState
//
previousState: any;
currentState: any;
}
}
我将其命名为IRootScopeService.d.ts,因为它是一个使用declare 关键字的声明文件。为了保持模块化,此文件将仅用于使用app.IRootScopeService 访问interface。
现在,在控制器文件中,controller 函数是这样的:
//CoreCtrl-ctrl.ts
...
function CoreCtrl(
$state: angular.ui.IState,
$rootScope: app.IRootScopeService
) {
var vm = this;
$rootScope.previousState = undefined;
$rootScope.currentState = undefined;
$rootScope.$on('$stateChangeSuccess', function(ev, to, toParams, from, fromParams) {
$rootScope.previousState = from.name;
$rootScope.currentState = to.name;
})
// $rootScope.previousState = undefined;
// $rootScope.currentState = undefined;
}
...
请注意app.IRootScopeService,它为我们提供了我们想要的$rootScope 的type。现在$rootScope.currentState 和$rootScope.previousState 不会在typescript 中报错。
第 2 部分
我们可以在新文件IScope.d.ts 中向模块app 添加更多interfaces,以保持模块化:
// IScope.d.ts
declare module app {
interface IScope extends ng.IScope {
//
$root: IRootScopeService;
//
greet:string;
name:string;
address:string;
}
}
现在,我们有两个个性化/定制界面app.IRootScopeService和app.IState,我们可以在其中继续添加新的properties,我们希望添加到$rootScope和$scope。
请注意,我们没有在$root: IRootScopeService; 中添加ng. 前缀,因为我们是从module app 内部访问app.IRootScopeService。
希望这会有所帮助。祝你好运。