Website-Suche

javascript - Dynamische Erweiterung einer Klasse in einer TypeScript-Annotation


Angenommen, ich habe 2 Klassen, A und B. Ich möchte eine TypeScript-Anmerkung erstellen, die dasselbe macht, wie eine Klasse dynamisch zu erweitern. Ich kann extends nicht verwenden, weil die Klasse A erst zur Laufzeit bekannt ist. Also möchte ich als Ergebnis class A extends B {} Aber mit dynamischem A.

Ich habe versucht, eine Anmerkung zu erstellen :

function extendsWithB(target) {
  //do something to extends the target with B class
  return target;
}

Dies könnte so verwendet werden:

 @extendsWithB
   Class A {}

Hast du eine Idee, was ich in meine Anmerkung schreiben sollte?

Bearbeiten: Diese Frage ist rein theoretisch. Ich möchte das nicht in der Produktion oder irgendwo anders ausprobieren.

Antwort #1

Ich denke, du kannst einen ähnlichen gewünschten Effekt erzielen, indem du so etwas machst:

export function Ext(bCtor: any) 
{
    return (aCtor: any) => 
    {
        Object.getOwnPropertyNames(bCtor.prototype).forEach(name => {
            aCtor.prototype[name] = bCtor.prototype[name];
        });
    }
}

Und wende es an:

@Ext(B)
class A
{
    //...
}

Natürlich keine weiteren Typprüfungen, da TypeScript nichts über diesen Hack weiß.