Sur la page de référence de décorateur de type Doctorat, il y a un code coupé qui illustre comment remplacer le constructeur avec décorateur de classe:
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"));
et dans les journaux:
class_1 {
property: 'property',
hello: 'override',
newProperty: 'new property' }
Jusqu'ici tout va bien. Mais essayer d'accéder à newProperty
par notation de points échoue avec:
Propriété 'NewProperty' n'existe pas sur le type 'Greeter'.TS (2339)
erreur et ce n'est pas répertorié dans les indications dans le code VS. On peut y accéder par la notation avec support mais TS avertit que
Élément implicitement a un type "n'importe quel" car type "Greeter" n'a pas de signature d'index.TS (7017)
Est-ce que je manque quelque chose? Comment mettre en œuvre l'ajout de nouvelles propriétés via des décorateurs de type-CARE? J'aimerais avoir un soutien normal du compilateur, comme avec des membres de la classe ordinaire.
function classDecorator<T extends { new(...args: any[]): {} }>(constructor: T) {
return class extends constructor {
newProperty = "new property";
hello = "override";
}
}
interface classInterface {
newProperty: string;
hello: string;
}
//trick
interface Greeter extends classInterface { };
@classDecorator
class Greeter {
property = "property";
hello: string;
constructor(m: string) {
this.hello = m;
}
}
const b = new Greeter();
console.log(b.newProperty);
Semble que nous pouvons utiliser un truc d'interface pour résoudre le problème. Référence de l'astuce: https://stackoverflow.com/a/52373394/4831179