Каков шаблон для перехвата выполнения конструктора в TypeScript с использованием aspect.js?
Это не документированный AFAICT, и мой обходной путь - добавить статический фабричный метод с именем new
к каждому классу, а затем статическиперехватите это, используя beforeStaticMethod
advice:
import { Wove as Advised } from 'aspect.js'
import './aspects/Aspect'
import './aspects/Aspect2'
@Advised()
export default class Thing {
static new (s: string = '', t: number = 0) {
return new Thing(...arguments)
}
// ...
}
затем, в аспекте:
import {
Metadata,
beforeStaticMethod,
beforeMethod,
afterStaticMethod,
afterMethod,
beforeGetter,
beforeSetter,
afterGetter,
afterSetter
} from 'aspect.js'
export default class Aspect {
@beforeStaticMethod({ classNamePattern: /.*/, methodNamePattern: /^new$/ })
beforeNew (meta: Metadata) {
console.log('Aspect beforeNew')
}
// ...
}
Это работает, но для разработчиков TypeScript / JavaScript неестественно использовать метод new
вместо обычного new Thing()
синтаксиса.