2014-06-28 57 views
6

Böyle bir şey kullanamazsınız?Typescript jenerikleri, jenerikleri uygulamak için tip silme kullanır mı?

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

     return <T>val; 
    } 
} 

Genel bildirimin temel türünü almak için herhangi bir geçici çözüm var mı?

Güncelleme 1: Ryan Cavanaugh belirtildiği gibi derlenmiş zaman

, bütün tip sistemi daha eşdeğer ilaç Java'nın uygulanması gibi silinir. Ben inanıyorum. Derlenmiş kodda tür bilgilerini korumak için Generics'in Net uygulaması Java'dan daha iyidir. Ancak, yardımcı olamıyorum ama merak ediyorum, neden genel çalışma türleri ve genel tür parametreleri için tam çalışma zamanı içgörüsüne izin vermek mümkün değil. Neden TypeScript tasarımcıları çalışma zamanında tüm jenerik tip bilgilerini kaldırmaya karar verdi?

şu typescript kodu:

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

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

bu JavaScript koduna çevrilebilinirler:

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

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

js kodu ile zamanında ve uyumluluk en türü bilgilerini koruma!

Güncelleme 2: Ben typescript insanlar tür sistemi tamamen silinir https://typescript.codeplex.com/discussions/550262

+0

... o SO stile JavaScript derleyici tarafından yayılan önce tüm tip bilgiler silinir şartname durumlarının –

+1

Page 2 kapalı doesnt umuduyla. Bu bilgiler ışığında, en iyi tahminim, çalışma ortamınızın çalışma ortamı içinde anlamsız olacağını söyleyebilir. En iyi tavsiyem, http://typescript.codeplex.com/discussions/topics/5488/language-specification: http://typescript.codeplex.com/discussions/topics/5488/deguage-specification adresindeki forumlarında bir gönderi oluşturmak olacaktır. Henüz değilse, onları desteklemeyi düşünebilirsin. –

+0

@ErikNedwidek Zaten üzerinde :) –

cevap

5

daha iyi yararlanmak için umut Codeplex meseleyi gönderdiniz. Bunu, herhangi bir genel işlev için oluşturulan kodda görebilirsiniz.

Bu, dersler için hala bazı çalışma zamanı bilgilerinin kaldığını söyledi. Bu yazabiliriz: Ne harika bir soru

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

Çalışma zamanında türlerini korumak için tip argümanı olması mükemmel bir anlam ifade ediyor, ancak neden TypeScript tasarımcılarının neden jenerik türlerini oluşturulan js kodunda kaldırmaya karar verdiklerini merak ediyorum. –

+0

@KamyarNazeri'deki orijinal gönderideki güncellemeye bakın. "Çalışma zamanında türleri korumak için tip argümanı olması mükemmel bir anlam ifade eder". Ama Javascript ördek tipi bir dil değil mi? Hedef ortamın bir tür kavramı olmadığı için, tam tipte silmeyi mükemmel bir şekilde yapar. – Aron

+0

@Aron Kastettiğimi yanlış anladığına inanıyorum. yöntem imzası korunurken, * type argümanı * derlenmiş js dosyasında korunur! Bununla birlikte, tip silme ile kaldırılan yöntem imzaında bulunmadığında Genel tür beyanıdır.Bunun yanında JavaScript'in ördek tipli bir dil olduğu doğrudur, ancak JavaScript'in bir üst kümesi olan TypeScript inanıyorum Genel tip silme işleminin biraz daha fazla sorun olabileceğine inanıyorum –

İlgili konular