Använder Typescript-generics typutplåning för att implementera generics?
Betyder det att du inte kan använda något sånt här?
class Helpers
{
static ObjectAs<T>(val: any): T {
if (!(val instanceof T)) {
return null;
}
return <T>val;
}
}
Finns det någon lösning för att få den underliggande typen av den generiska deklarationen?
Uppdatering 1:
Som Ryan Cavanaugh nämnde, när det kompileras, raderas hela typsystemet, mer som Javas implementering av generics. Jag tror att .Nets implementering av generics för att bevara typinformation i den kompilerade koden är bättre än Java. Men jag kan inte låta bli att undra, varför är det inte möjligt att tillåta fullständig runtime-introspektion av generiska typer och generiska typparametrar i TypeScript? Varför beslutade skaparna av TypeScript att ta bort all generisk typinformation vid runtime?
Följande TypeScript-kod:
function As<T>(n: any): T {
if (n instanceof T) {
return n;
} else {
return null;
}
}
var obj: Object = 1;
var x = As<number>(obj);
Kan översättas till denna JavaScript-kod:
function As(n, T) {
if (n instanceof T) {
return n;
} else {
return null;
}
}
var obj = 1;
var x = As(obj, Number);
Bevara typinformationen vid körning och kompatibilitet med JS-koden!
Uppdatering 2: Jag har lagt upp problemet på CodePlex, i hopp om att få mer från TypeScript-folk https://typescript.codeplex.com/discussions/550262
Svar #1
Typsystemet är helt borttaget. Du kan se detta i den genererade koden för vilken generisk funktion som helst.
Det sagt, för klasser finns det fortfarande viss runtime-information kvar. Du kan skriva detta:
class A { }
class B { }
function As<T>(n: any, type: { new(...args: any[]): T }): T {
if(n instanceof type) {
return n;
} else {
return null as any;
}
}
var x = new A();
var y = new B();
console.log(As(x, A));
console.log(As(x, B));
