Generisk typreflektion i TypeScript


Kan jag bestämma den generiska typen T i följande scenario?

class MyClass {
    constructor() {
    }

    GenericMethod<T>(): string {
        return typeof(T);           // <=== this is flagged by the compiler,
                                    //      and returns undefined at runtime
    }
}

class MyClass2 {
}

alert(new MyClass().GenericMethod<MyClass2>());

Svar #1

Eftersom typerna tas bort under kompileringen är de inte tillgängliga när koden körs.

Detta betyder att du måste göra en liten duplicering...

class MyClass {
    constructor() {
    }

    GenericMethod<T>(targetType: any): string {
        return typeof(targetType); 
    }
}

class MyClass2 {
}

alert(new MyClass().GenericMethod<MyClass2>(MyClass2));

I det här fallet får du svaret function, men du ville förmodligen ha MyClass2.

Jag har skrivit ett exempel på hur man får typnamn vid körning i TypeScript, som ser ut så här:

class Describer {
    static getName(inputClass) { 
        var funcNameRegex = /function (.{1,})\(/;
        var results = (funcNameRegex).exec((<any> inputClass).constructor.toString());
        return (results && results.length > 1) ? results[1] : "";
    }
}

class Example {
}

class AnotherClass extends Example {
}

var x = new Example();
alert(Describer.getName(x)); // Example

var y = new AnotherClass();
alert(Describer.getName(y)); // AnotherClass

Relaterade artiklar