【问题标题】:Properly extend constructor with decorators使用装饰器正确扩展构造函数
【发布时间】:2020-08-20 01:41:24
【问题描述】:

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

阅读手册有一个注释说

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】:

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

    然后循环进入原始类描述符并返回变量。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-09
      • 2019-10-06
      • 2013-11-15
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 2017-03-06
      • 2017-05-04
      相关资源
      最近更新 更多