Obține lista claselor extinse în TypeScript


Am:

classA 
classB extends ClassA
classC extends ClassB

Am creat obiect pe classC:

var myClassC= new classC();

ClassA are această metodă:

public get className(): string {
    var funcNameRegex = /function (.{1,})\(/;
    var results = (funcNameRegex).exec(this["constructor"].toString());
    return (results && results.length > 1) ? results[1] : "";
}

Care returnează șirul „ClassC” dacă apelez myClassC.getClassName();

Ceea ce am nevoie este să obțin o listă a tuturor claselor până la clasa de bază: ClassC, ClassB, ClassA. Există o modalitate de a face asta?

Răspuns #1

Da, asta este într-adevăr posibil:

function getClassName(obj: any): string {
    var funcNameRegex = /function (.{1,})\(/;
    var results = (funcNameRegex).exec(obj.constructor.toString());
    return (results && results.length > 1) ? results[1] : "";
}

class ClassA {
    public get className(): string[] {
        let classNames = [];
        let obj = Object.getPrototypeOf(this);
        let className: string;

        while ((className = getClassName(obj)) !== "Object") {
            classNames.push(className);
            obj = Object.getPrototypeOf(obj);
        }

        return classNames;
    }
}

class ClassB extends ClassA {}

class ClassC extends ClassB {}

let a = new ClassA();
console.log(a.className); // ["ClassA"]

let b = new ClassB();
console.log(b.className); // ["ClassB", "ClassA"]

let c = new ClassC();
console.log(c.className); // ["ClassC", "ClassB", "ClassA"]

(cod în teren de joacă)