2014-06-28 14 views
6

To znaczy, że nie możesz użyć czegoś takiego?Czy typy generyczne maszynopisu używają typu wymazywania do implementacji generycznych?

class Helpers 
{ 
    static ObjectAs<T>(val: any): T { 
     if (!(val instanceof T)) { 
      return null; 
     } 

     return <T>val; 
    } 
} 

Jakiekolwiek obejście, aby uzyskać podstawowy rodzaj zgłoszenia?

Aktualizacja 1:

Jak wspomniano Ryan Cavanaugh, po opracowaniu, cały system typu są usuwane, bardziej jak wdrożenie Java Generics. Wierzę, że .Net implementacja Generics do zachowania informacji o typie w skompilowanym kodzie jest lepsza niż Java. Jednak nie mogę pomóc, ale zastanawiam się, dlaczego nie jest możliwe zezwolenie na pełną introspekcję runtime typów ogólnych i ogólnych typów parametrów w TypeScript? Dlaczego projektanci TypeScript zdecydowali się usunąć wszystkie ogólne informacje o typie w czasie wykonywania?

następujący kod maszynopis:

function As<T>(n: any): T { 
    if (n instanceof T) { 
     return n; 
    } else { 
     return null; 
    } 
} 

var obj: Object = 1; 
var x = As<number>(obj); 

można przetłumaczyć do tego kodu JavaScript:

function As(n, T) { 
    if (n instanceof T) { 
     return n; 
    } else { 
     return null; 
    } 
} 

var obj = 1; 
var x = As(obj, Number); 

Zachowanie informacji o typie w czasie wykonywania i zgodności z kodem js!

Aktualizacja 2: ja pisał tę kwestię na CodePlex, chcąc dostać więcej od maszynopis ludzi https://typescript.codeplex.com/discussions/550262

+0

Co za niesamowite pytanie ... nadzieję, że nie robi zamknięte więc stylem –

+1

stronie 2 stanach specyfikacji, że wszystkie informacje typu są usuwane przed JavaScript jest emitowany przez kompilator. Biorąc pod uwagę te informacje, według mojej najlepszej opinii, operator instanceof nie miałby znaczenia w środowisku wykonawczym. Moja najlepsza rada to stworzenie posta na forum poświęconym specyfikacji: http://typescript.codeplex.com/discussions/topics/5488/language-specification. Możesz zmusić ich do myślenia o wspieraniu tego, jeśli jeszcze nie jest. –

+0

@ErikNedwidek Już na nim :) –

Odpowiedz

5

System typ jest całkowicie wymazane. Możesz to zobaczyć w wygenerowanym kodzie dla dowolnej ogólnej funkcji.

To powiedziawszy, dla klas nadal pozostało trochę informacji o czasie pracy. można napisać tak:

class A { } 
class B { } 
function As<T>(n: any, type: { new(...args: any[]): T }): T { 
    if(n instanceof type) { 
     return n; 
    } else { 
     return null; 
    } 
} 

var x = new A(); 
var y = new B(); 
console.log(As(x, A)); 
console.log(As(x, B)); 
+0

Posiadanie argumentu typu do zachowania typów w czasie wykonywania ma sens, jednak zastanawiam się, dlaczego projektanci TypeScript zdecydowali się całkowicie usunąć generyczne typy w wygenerowanym kodzie js? zobacz aktualizację w oryginalnym wpisie –

+0

@KamyarNazeri "Posiadanie argumentu typu do zachowania typów w czasie wykonywania ma sens". Ale czy JavaScript nie jest językiem kaczym? Ponieważ środowisko docelowe nie ma koncepcji typu, to ma sens w przypadku całkowitego wymazywania typu. – Aron

+0

@ Amron Wierzę, że źle zrozumiałeś co miałem na myśli. argument * typu * jest zachowywany w skompilowanym pliku js, ponieważ podpis metody jest zachowany! Jednak jest to deklaracja typu rodzajowego - jeśli nie występuje w metodzie podpisu - która jest usuwana przez typ wymazania.Poza tym jest prawdą, że JavaScript jest językiem typu kaczego, jednak TypeScript jest nadzbiorem do JavaScript. Wierzę, że wymazanie typu ogólnego może być nieco większym problemem. –

Powiązane problemy