Документация Typescript для Class Decorator - функция, возвращающая "class extends constructor {}"
Итак, я пытаюсь понять, что такое декораторы 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
Цени любую помощь!
2 ответа
Вам нужно посмотреть полную декларацию декоратора:
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
методы и свойства (конструктор - это декорируемый класс).
Что касается « расширения класса », это синтаксис javascript ES6:«выражение класса»
вы можете проверить этот код в скрипте :
class Car {
constructor(brand) {
this.carname = brand;
}
present() {
return 'I have a ' + this.carname;
}
}
const Model = class extends Car {
constructor(brand, mod) {
super(brand);
this.model = mod;
}
show() {
return this.present() + ', it is a ' + this.model;
}
}
console.log(new Model("Ford", "Mustang").show());
---результат: "Бегущая скрипка" "У меня Форд, это Мустанг"