如果你想在 TypeScript 中使用 AOP,你可以通过提供定义来使用现有的 AOP 框架。这是一个使用 jQuery.aop 的完整示例。
以这种方式使用 AOP 不会影响您现有的任何定义,因为 AOP 代码在您正在横切的代码上是不可见的。
aop.d.ts
declare class Advice {
unweave(): void;
}
declare interface PointCut {
target: Object;
method: string;
}
declare class Aop {
before: (pointCut: PointCut, advice: Function) => Advice[];
after: (pointCut: PointCut, advice: Function) => Advice[];
afterThrow: (pointCut: PointCut, advice: Function) => Advice[];
afterFinally: (pointCut: PointCut, advice: Function) => Advice[];
around: (pointCut: PointCut, advice: Function) => Advice[];
introduction: (pointCut: PointCut, advice: Function) => Advice[];
}
interface JQueryStatic {
aop: Aop;
}
应用程序.ts
/// <reference path="jquery.d.ts" />
/// <reference path="aop.d.ts" />
class ExampleClass {
exampleMethod() {
alert('Hello');
}
}
jQuery.aop.before(
{ target: ExampleClass, method: 'exampleMethod' },
function () { alert('Before exampleMethod'); }
);
jQuery.aop.after(
{ target: ExampleClass, method: 'exampleMethod' },
function () { alert('After exampleMethod'); }
);
var example = new ExampleClass();
example.exampleMethod();
示例来源:带有 TypeScript 的 AOP。
更新
要将相同的关注点添加到类和所有兼容的类中,您不能重用基类点。这是因为包装器是原来的基类函数,包装在点中,这对于扩展基类的类将是错误的实现。
唯一有效的情况是,如果您的函数仅在这种情况下调用super()
,它无论如何都会起作用。
以下是我如何将相同的关注点添加到许多类 - AopHelper 只需要在您的程序中存在一次:
/// <reference path="jquery.d.ts" />
/// <reference path="aop.d.ts" />
class ExampleClass {
exampleMethod() {
alert('Hello');
}
}
class SecondClass extends ExampleClass {
exampleMethod() {
alert('World');
}
}
class AopHelper {
static weave(targets: Object[], method: string, point: Function, advice: Function) {
for (var i = 0; i < targets.length; i++) {
point({ target: targets[i], method: method }, advice );
}
}
}
var classes: any[] = [ExampleClass, SecondClass];
AopHelper.weave(classes, 'exampleMethod', jQuery.aop.before, () => { alert('Before exampleMethod'); });
AopHelper.weave(classes, 'exampleMethod', jQuery.aop.after, () => { alert('After exampleMethod'); });
var example = new SecondClass();
example.exampleMethod();