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

问题描述 投票:0回答:1

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

阅读手册中有条注释说

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

}
typescript constructor typescript-decorator
1个回答
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;

}
© www.soinside.com 2019 - 2024. All rights reserved.