具有泛型params的角度ui-state在打字稿中输入

时间:2018-03-12 09:56:54

标签: angularjs typescript generics angular-ui-router

我们使用 angular-ui-router.js v 0.2.18 + angular-ui-router.d.ts v 1.4.6(typescript v 1.8.36.0 )。

因此我们使用IStateProvider配置从一个州到另一个州的导航 通常我们需要将一些状态参数从父状态传递到子状态。
配置:

.state(States.MeasureDetail, {
    parent: States.OperatorView,
    templateUrl: '/App/Business/Kanban/BuildAndCureKanban/Views/MeasureDetail.html',
    controller: Controllers.MeasureDetailController,
    controllerAs: 'measureDetailCtrl',
    params:
    {
        machine: null,
        material: null
    }
})

在父亲控制器中:

this.$state.go(States.MeasureDetail, {
        machine: this.currentMachine,
        material: this.currentMaterial
     });

在儿童控制器中:

constructor(
    private buildAndCureService: Services.IBuildAndCureService,
    private $state: ng.ui.IStateService,
    private eventManager: _Common.Services.IEventManager){

    this.machine = $state.params["machine"];
    this.material = $state.params["material"];
}

问题
没有params属性和IStateParameterService接口都是强类型的:你可以通过密钥访问并获得任何类型。

params?: any;

interface IStateParamsService {
    [key: string]: any;
}

这是一个弱点,在许多开发人员的大项目中,已经带来了运行时问题。

问题 我知道可以像the example in this post to add a typed field一样扩展IStateParameterService,但解决方案对于所有状态都是一次,而我需要一个解决方案来逐州添加类型字段。
如何将IStateParameterService扩展为:

interface IStateParamsService {
    CustomParam<T>?: T;
}


感谢。

1 个答案:

答案 0 :(得分:0)

这里没有必要全局扩展IStateParameterService,因为它应该是本地的。

由于$stateParams在{x}中为deprecated,因此将$state用于迁移目的是合理的,因此直接扩展IStateService而不是{{} 1}}:

IStateParameterService