Документация Typescript для Class Decorator - функция, возвращающая "class extends constructor {}" - PullRequest
1 голос
/ 19 мая 2019

Итак, я пытаюсь понять, что такое декораторы Typescript, и застрял на примере, приведенном для декораторов классов. В приведенном примере показано, как создать декоратор класса с помощью функции () {}.

  function classDecorator<T extends {new(...args:any[]):{}}>(constructor:T){
        return class extends constructor {
            newProperty = "new property";
            hello = "override";
        }
    }    

    @classDecorator
    class Greeter {
        property = "property";
        hello: string;
        constructor(m: string) {
            this.hello = m;
        }
    }    

    console.log(new Greeter("world"));

Что такое:

return class extends constructor {
    newProperty = "new property";
    hello = "override";
}

Как может функция, возвращающая ключевое слово "class", которое расширяет параметр (называемый "construct")? Я так растерялся.

Вот ссылка на первоисточник (просто выделите среднюю часть декоратора классов): https://www.typescriptlang.org/docs/handbook/decorators.html

Ценю любую помощь!

1 Ответ

0 голосов
/ 20 мая 2019

Вам нужно посмотреть полную декларацию декоратора:

function classDecorator<T extends {new(...args:any[]):{}}>(constructor:T) {
    return class extends constructor {
        newProperty = "new property";
        hello = "override";
    }
}

Это довольно мрачно, но вот что происходит.

Тип constructor - это то, что удовлетворяет параметру типа T.

Этот параметр типа T extends {new(...args:any[]):{}} применяется к любому объекту, у которого есть конструктор, который принимает любое количество аргументовлюбой тип (т. е. почти что угодно).

Вместо этого передается constructor, который передается в этот декоратор, возвращается другой класс.

Обратите внимание, что синтаксис return class { ... } - это способ вернуть анонимный класс из функции, подобно тому, как return function() { ... } возвращает анонимную функцию.

И class extends constructor означает, что анонимный класс наследует все методы и свойства constructor.(конструктор - это декорируемый класс).

...