用decorator正确地扩展构造函数



如何在不丢失类名、静态属性和方法的情况下,使用decorator正确扩展类构造函数。

阅读手册时,有一张纸条上写着

https://www.typescriptlang.org/docs/handbook/decorators.html#class-装饰

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;
}

最新更新