使用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中实现这个接口??
好的,我发现在这种情况下接口可以定义一个函数类型。这与我通常查看界面的方式造成了混淆。我似乎无法使用"工具"在这种情况下?
答案 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');
}
}
})();