web-dev-qa-db-fra.com

Ajout de propriétés à une classe via des décorateurs dans Typescript

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.

8
Forseti
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

2
blackmiaool