使用VS 2013在Typescript中装饰角度exceptionHandler服务

时间:2015-01-28 18:54:42

标签: angularjs visual-studio-2013 typescript

使用Typescript和Visual Studio 2013

我想装饰angularjs $ exceptionHandler,我不太确定正确的方法。我装饰了$ log,它运行正常。

我的配置:

MyAngularModule.config(['$provide',($provide) => {
    $provide.decorator('$log', ['$delegate', function ($delegate) {
        var myLog: MyLogService.LogService = new MyLogService.LogService();
        return myLog;
    }]);
}]);

MyLogService.ts

export = Example;
module Example {
    export class LogService implements ng.ILogService{ 
        constructor() {}
        public assertEmpty = () => { };
        public reset = () => { };
        public info: ng.ILogCall = ...all my code...
    }
}

现在,当我尝试使用$ exceptionHandler执行类似的操作时:

$provide.decorator('$log', ['$delegate', function ($delegate) {
        var myExHandler: MyExHandler.ExHandlerService = new MyExHandler.ExHandlerService();
        return myExHandler;
    }]);

类型文件中exceptionHandler的接口定义是:

interface IExceptionHandlerService {
    (exception: Error, cause?: string): void;
}   

我如何编写类似于我在装饰日志服务时的方式?

我试过了:

export = Example;
module Example {
    export class ExHandlerService implements ng.IExceptionHandlerService{ 
        constructor(anException: Error, aCause?: string) {}

    }
}

Visual Studio抱怨界面实现错误。我真的不明白(异常:错误,原因?:string):void;意思是,它是构造函数吗? typing文件确实显示了一个名称,只是这个匿名方法定义。

我不明白我是如何在装饰调用中处理这个问题的(即错误和原因参数来自何处以及如何保持默认实现的运行?)

提前致谢。

更新

考虑在angular.d.ts:

interface IExceptionHandlerService {
    (exception: Error, cause?: string): void;
}

我想我的根本混淆是如何在Typescript中实现这个接口??

好的,我发现在这种情况下接口可以定义一个函数类型。这与我通常查看界面的方式造成了混淆。我似乎无法使用"工具"在这种情况下?

2 个答案:

答案 0 :(得分:3)

我想我已经找到了自己的答案。无论如何,这里是我如何在Typescript中修饰角度异常处理程序服务。

export class MyExceptionHandlerService { 


    private _defaultExceptionHandlerService: ng.IExceptionHandlerService;


    constructor(paramDelegate: ng.IExceptionHandlerService) {

        this._defaultExceptionHandlerService = paramDelegate;
    }

    public exception: ng.IExceptionHandlerService = (paramException: Error, paramCause?: string): void => {

        console.error("MY ERROR HANDLER: " + paramException.message)

        this._defaultExceptionHandlerService(paramException, paramCause);

    }



}

我从我的角度配置部分使用它:

$provide.decorator('$exceptionHandler', ['$delegate', function ($delegate: ng.IExceptionHandlerService) {


                var localExceptionHandler: MyHandler.ExceptionHandlerService = new MyHandler.ExceptionHandlerService($delegate);

                return localExceptionHandler.exception;
            }]);

它按预期工作。

答案 1 :(得分:3)

你也可以在不使用对象的情况下完成这样的事情......不确定这是不是好事。反馈会很棒!

((): void => {
    'use strict';

    angular
        .module('app.blocks')
        .config(config);

    config.$inject = ['$provide'];

    function config($provide: ng.auto.IProvideService): void {
        $provide.decorator('$exceptionHandler', extendExceptionHandler);
    }

    extendExceptionHandler.$inject = ['$delegate', 'app.blocks.logger'];
    function extendExceptionHandler(
        $delegate: any,
        logger: app.blocks.ILogFactory): Function {

        return (exception: Error, cause?: string, source? : string) => {
            $delegate(exception, cause);
            logger.log(exception.message, { exception: exception, cause: cause }, source, 'error');
        }
    }
})();