类实例之前的Typescript装饰程序

类实例之前的Typescript装饰程序,typescript,webpack,decorator,typescript-decorator,reflect-metadata,Typescript,Webpack,Decorator,Typescript Decorator,Reflect Metadata,我在玩Typescript装饰程序,当我实例化一个类时,一切都很好。 使用以下代码,将调用我的类装饰器: 从./MyClass导入{MyClass}; const myClass=新的myClass; 但是当我没有像上面的例子那样显式地实例化这个类时,就不会调用decorator。例如,此模块:依赖这样的结构将所有类保存在存储器中并生成映射。我在没有先实例化类并生成映射的情况下尝试了它,但它也不起作用。在实例化放置decorator的类之前,是否必须设置任何Web包或Typescript配置以执

我在玩Typescript装饰程序,当我实例化一个类时,一切都很好。 使用以下代码,将调用我的类装饰器: 从./MyClass导入{MyClass}; const myClass=新的myClass;
但是当我没有像上面的例子那样显式地实例化这个类时,就不会调用decorator。例如,此模块:依赖这样的结构将所有类保存在存储器中并生成映射。我在没有先实例化类并生成映射的情况下尝试了它,但它也不起作用。在实例化放置decorator的类之前,是否必须设置任何Web包或Typescript配置以执行decorators?据我所知,在一些在线教程中,定义了在定义类时调用类装饰器,而不是在实例化类时调用类装饰器。
干杯

您可以用类级装饰器替换原来的类构造函数,以完成各种很酷的工作:

function example(target: any) {
    // save a reference to the original constructor
    const original = target;

    // the new constructor behaviour
    const f: any = function (...args: any[]) {
        console.log("Hook before original constructor...");

        const newArgs = [...args].reverse();

        const instance = new original(...newArgs);

        console.log("Hook after original constructor...");

        instance.d = 'ddd';

        return instance;
    }

    // copy prototype so intanceof operator still works
    f.prototype = original.prototype;

    // return new constructor (will override original)
    return f;
}

@example
class SomeClass {
    constructor(public a: number, public b: number, public c: number) {
        console.log("Hello from constructor!")
    }
}

const instance1 = new SomeClass(1, 2, 3);
console.log(instance1); // SomeClass {a: 3, b: 2, c: 1, d: "ddd"}

在方法或实例化发生时,而不是在定义时调用decorator。我知道我可以用decorator做什么,但来看看你的例子:是否可以运行类decorator,例如,在不实例化类的情况下将类保存到内部类映射的decorator?我希望我所有的类名都通过一个decorator在内部保存,但我不希望每个可能的请求都实例化所有的类。。。但无论如何,还是要感谢这个例子!声明类时,将运行类级装饰器。现在有一个窗口用于替换构造函数/方法、保存元数据等…所以没有一个分析器来分析所有类的装饰器?总之:我必须自己调用所有的类,所以当我想在请求到来之前调用所有类的所有类装饰器时,这个过程不能是动态的?正如我前面所说的。类级装饰程序只运行一次。当类被声明为不在实例创建时。因此,即使从未构造过任何实例,也可以注册修饰的类名。谢谢!当所有类都在外部文件中声明时?那么它们至少应该进口?