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
