如何在不丢失类名以及静态属性和方法的情况下,使用装饰器正确扩展类构造函数。
阅读手册中有条注释说
https://www.typescriptlang.org/docs/handbook/decorators.html#class-decorators
NOTE Should you choose to return a new constructor function,
you must take care to maintain the original prototype.
The logic that applies decorators at runtime will not do this for you.
如果我这样做-就像手册中那样-我会丢失类名和静态方法
function my_decorator<T extends { new(...constr_args:any[]):any }>(constr_func:T){
return class extends constr_func {
constructor(...args: any[]){
// DO STUFF
super(...args);
// DO STUFF
}
}
}
为了将原始类的所有描述符复制到新的扩展类中,我需要实例化一个变量并将扩展类分配给它-不给该类命名。
然后循环到原始类描述符中,并返回变量。
function my_decorator<T extends {new (...constr_args:any[]):any}>(constr_func: T){
const ExtClass = class extends constr_func {
constructor(...args: any[]){
// DO STUFF
super(...args);
// DO STUFF
}
}
for(const property_name of Object.getOwnPropertyNames(constr_func)) {
const descr = Object.getOwnPropertyDescriptor(constr_func, property_name)!;
if(property_name != 'prototype')
Object.defineProperty(ExtClass, property_name, descr);
}
return ExtClass;
}