用装饰器正确扩展构造函数

时间:2020-05-05 11:48:37

标签: typescript constructor typescript-decorator

如何在不丢失类名称以及静态属性和方法的情况下,使用装饰器正确扩展类构造函数。

在阅读手册时,有一条便笺

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

}

1 个答案:

答案 0 :(得分:0)

为了将原始类的所有描述符复制到新的扩展类中,我需要实例化一个变量并为其分配扩展类-而不给该类命名。

然后循环到原始类描述符中,并返回变量。

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;

}