2016-03-30 22 views
2

Lütfen, TypeScript ile yeni başlayan biri olduğum için benimle çıplak ol.TürScript'te genel türün algılanması

Bir nesneden anahtar olarak bakmak için argüman olarak bir dizgi kabul eden basit bir yöntem yazıyorum. Bu yöntemin, döndürülen nesneyi yazmak için kullanılacak genel bir türü vardır. Ancak, bu beklendiği gibi çalışmıyor. Aslında, tahmin değerleri mümkün mü ve eğer öyleyse, bunu nasıl yaparım?

class Application 
{ 
    private values : {[s : string] : string} = { 
     "foo" : "bar", 
     "test" : "1234" 
    } 

    public getValue<T>(key : string) : T 
    { 
     if (this.values.hasOwnProperty(key)) { 
      switch (typeof T) {     // Doesn't work 
       case "string": 
        return this.values[key].toString(); 
       case "number": 
        return parseInt(this.values[key]); 
       default: 
        throw new Error("Type of T is not a valid return type!"); 
      } 
     } else { 
      throw new Error("Key '" + key + "' does not exist!"); 
     } 
    } 
} 

var app : Application = new Application(); 
app.getValue<number>("test"); // Should return 1234 
app.getValue<string>("test"); // Should return '1234' 
+0

nasıl typeof anahtarı değil, typeof T denetlenmesi hakkında? – uksz

+0

@uksz 'anahtar' değişkeni her zaman bir dize olacak, çünkü bir nesneden değerlere erişiyorum, hemen hemen sadece kodumun değerini yazım için doğru değere dönüştürmeye çalışıyorum – Paradoxis

+1

Bu gerçekten jeneriklerin tam olarak değil kastedilen: listeniz genel bir şeydir. Şu anda, arayanın sonuç değerini nasıl yorumlamak istediğini bilmesi gerekiyor, o zaman neden sadece açık bir parametre yapmıyoruz? getValue (anahtar: string, type: string) {geçiş (tür) {// tip anahtarlama}} '. "T" nin bir tür olması gerektiği halde, aslında bu değeri yayınlamak için bu tür * kullanmadığınıza dikkat edin: Arayanın isteğine bağlı olarak yalnızca farklı işlemler gerçekleştiriyorsunuz. Yani, açık, dize tabanlı tür, hemen hemen eşdeğerdir ve çalışmanın ek yararına sahiptir. – dlev

cevap

1

ben size yönteminde key ve T kafa karıştırıcı olduğunu düşünüyorum. Ben bunu böyle yazardı:

public getValue<T>(key : string) : T 
{ 
    if (this.values.hasOwnProperty(key)) { 
     switch (typeof key) {     // Doesn't work 
      case "string": 
       return this.values[key].toString(); 
      case "number": 
       return parseInt(this.values[key]); 
      default: 
       throw new Error("Type of T is not a valid return type!"); 
     } 
    } else { 
     throw new Error("Key '" + key + "' does not exist!"); 
    } 
} 

Sen typescript playground kullanarak nasıl çalıştığını daha iyi anlamak olacaktır. Eğer kod derleme yöntemiyle görebilirsiniz: derlenmiş JS hiçbir T yoktur

var Application = (function() { 
function Application() { 
    this.values = { 
     "foo": "bar", 
     "test": "1234" 
    }; 
} 
Application.prototype.getValue = function (key) { 
    if (this.values.hasOwnProperty(key)) { 
     switch (typeof T) { 
      case "string": 
       return this.values[key].toString(); 
      case "number": 
       return parseInt(this.values[key]); 
      default: 
       throw new Error("Type of T is not a valid return type!"); 
     } 
    } 
    else { 
     throw new Error("Key '" + key + "' does not exist!"); 
    } 
}; 
return Application; 
}()); 
var app = new Application(); 
app.getValue("test"); // Should return 1234 
app.getValue("test"); // Should return '1234' 

. Önceden derlenmiş olan sadece TypeScript'inizde görünür. Bunun dışında

, aramak mümkün değildir:

getValue<VALUE>(...) 
İlgili konular