Правильно расширьте конструктор с помощью декораторов - PullRequest
0 голосов
/ 05 мая 2020

Как правильно расширить конструктор класса с помощью декораторов без потери имени класса и его свойств c атрибутов и методов.

При чтении справочника есть заметка, в которой написано:

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.

Если я сделаю это - как в справочнике - я потеряю имя класса и stati c методы

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 голосов
/ 05 мая 2020

Чтобы скопировать все дескрипторы исходного класса в новый расширенный класс, мне нужно создать экземпляр переменной и назначить ему расширенный класс - без указания имени классу.

Затем l oop в исходный дескриптор класса и вернуть варибал.

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;

}
...