Декораторы Typescript перед экземпляром класса - PullRequest
0 голосов
/ 16 февраля 2020

Я играю с декораторами Typescript, и все хорошо работает, когда я создал класс. С помощью следующего кода мой Class-decorator вызывается: import { MyClass } from "./MyClass"; const myClass = new MyClass(); Но когда я не создаю экземпляр класса явно, как в примере выше, никакие декораторы не вызываются. Например, этот модуль: https://github.com/xrobert35/es-mapping-ts полагается на такую ​​структуру, чтобы сохранить все классы в хранилище и сгенерировать отображение. Я попробовал это, не создавая экземпляры классов вначале и не создавая отображение, но это тоже не работает. Существует ли какая-либо конфигурация Webpack или Typescript, которая должна быть настроена для запуска декораторов перед созданием экземпляров классов, в которых размещены декораторы? В моем уровне знаний и в некоторых онлайн-руководствах определено, что декораторы классов называются когда класс определен, а не когда экземпляр создан. Ура!

1 Ответ

1 голос
/ 16 февраля 2020

Вы можете заменить оригинальный конструктор класса декоратором на уровне класса, чтобы делать все интересные вещи:

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

Ссылка на игровую площадку

...