在Typescript中向rootscope添加值时出错。
class TestClass{
this.rootScope: ng.IRootScopeService;
constructor($rootScope){
this.rootScope = $rootScope;
}
addValueToRoot=()=>{
this.rootScope.val1 = "something"; //Error: Property doesn't exist on the IRootScopeService
}
}
答案 0 :(得分:18)
这是因为(正如编译器所说)val1
上不存在ng.IRootScopeService
。您需要对其进行扩展以使其适应您的需求,例如
interface MyRootScope extends ng.IRootScopeService {
val1: string
}
然后你可以在你的班级中使用这个界面:
class TestClass {
this.rootScope: MyRootScope;
...
}
答案 1 :(得分:7)
您可能正在使用TypeScript 1.6,它开始捕获此类错误。
我通常做的是:
使用$rootScope: any
执行($rootscope as any).val1 = ...
使用$rootScope: ng.IRootScopeService & { [name:string]: any };
No.3为该类型添加了额外属性的余量。您甚至可以将其保存在类型名称下以便重复使用:
type IExpandable = { [name:string]:any };
$rootScope: ng.IRootScopeService & IExpandable;
答案 2 :(得分:2)
其他替代方案是:
this.rootScope["val1"] = "something";
(<any>(this.rootScope)).val1 = "something";
答案 3 :(得分:1)
这对我有用:
在单独的文件中,我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
关键字的声明文件。为了使其保持模块化,此文件仅用于访问interface
app.IRootScopeService
。
现在,在控制器文件中,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
为我们type
提供了$rootScope
。现在$rootScope.currentState
和$rootScope.previousState
不会在typescript
中出错。
第2部分
我们可以在新文件interfaces
中向模块app
添加更多IScope.d.ts
,以保持模块化:
// IScope.d.ts
declare module app {
interface IScope extends ng.IScope {
//
$root: IRootScopeService;
//
greet:string;
name:string;
address:string;
}
}
现在,我们有两个个性化/自定义界面app.IRootScopeService
和app.IState
,我们可以继续添加新properties
我们要添加到{{1} }和$rootScope
。
请注意,我们在$scope
中没有ng.
前缀,因为我们正在$root: IRootScopeService;
内访问app.IRootScopeService
。
希望这会有所帮助。祝你好运。