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));

Relaterade artiklar