Следующий код взят из документации TS
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;
}
}
const g = new Greeter("world");
console.info(g.newProperty) // =>>>> ERROR for type check, but correct in runtime
Как мне выразить тип для украшенного класса?
Точнее, я хочу, чтобы intellisense увидел g.newProperty
Существует еще одна концепция, называемая mixin
, функция, которая возвращает измененный класс.
TypeScript может предложить правильные реквизиты для возвращаемого типа класса.
function Mixin<T extends { new (...args: any[]): object }>(BaseClass: T) {
return class extends BaseClass {
// The following constructor signature is a must for a mixin
// TypeScript error tells it explicitly
constructor(...args: any[]) {
super(...args)
// Additional stuff
}
// Additional functionality here
}
}
class A {}
const ModifiedA = Mixin(A);
const ModifiedAObject = new ModifiedA(/* params */);