2016-03-30 6 views
2

私はTypeScriptの初心者ですので、私と一緒に裸にしてください。TypeScriptのジェネリックタイプの検出

私はオブジェクトからキーとしてルックアップするための引数として文字列を受け入れる単純なメソッドを書いています。このメソッドにはジェネリック型があり、返されたオブジェクトを型キャストするために使用されます。しかし、これは期待どおりに機能していません。実際に値を型キャストすることは可能ですか?もしそうなら、私はこれをどうやって行いますか?

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

か? – uksz

+0

@uksz変数 'key'は常にオブジェクトからの値にアクセスしているので、文字列になります。自分の値を正しい形式に型キャストしようとしています。 – Paradoxis

+1

これは実際にジェネリックではありませんあなたのリストは一般的なものではありません。今、呼び出し元は結果の値を解釈する方法を知る必要があります。なぜそれを明示的なパラメータにしないのですか? 'getValue(key:string、type:string){switch(type){//タイプスイッチング}}'。 「T」は型でなければなりませんが、実際にはその型を使って値をキャストしているわけではありません。呼び出し元が要求した内容に応じて異なるアクションをとるだけです。したがって、明示的な文字列ベースの型はかなり同等であり、作業の追加の利点があります。 – dlev

答えて

1

私はあなたの方法でkeyTを混乱していると思います。私はそのように記述します。

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!"); 
    } 
} 

あなたは活字体がplaygroundを使って、どのように動作するかの理解を得るでしょう。コンパイル済みのJSにはTはありません

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' 

:あなたはどのようにあなたのコードがコンパイルされ見ることができます。これは、あらかじめコンパイルされたTypeScriptでのみ表示されます。

それとは別に、あなたが呼び出すことができません:typeof演算キーではなく、typeof演算Tを確認する程度

getValue<VALUE>(...)