2017-12-30 35 views
-1

私は、以下の機能を持っている:Promise <T>のようなPromiseにジェネリックスを渡しますか?

class RestService { 
    public async get<T>(func: string): Promise<T> { 
     var toRet = {}; 
     await fetch(EndPoint + func) 
     .then(response => response.json() as Promise<T>) 
     .then(data => { 
      toRet = data; 
     }) 
     .catch(e => { 
     }); 

     return toRet as T; 
    } 
} 

すべてが正常に動作しますが、私は「データ」で取得応答は常に汎用オブジェクトです。

class Model 
{ 
    string name; 
} 

などのような関数を呼び出します:私はそうのようなモデルを持っているかもしれません例えば

get<Model>("getmodel") 

応答は常にのように見える汎用オブジェクトです:

{name:"some name"} 

私の理解から、ジェネリックはTypescriptでサポートされており、Promiseは可変型を取ります。 ghtはgenericをgenericに渡すことができないということですか?

+0

応答が常にモデルの場合、メソッドは汎用ではなく、返される型は 'Promise 'でなければなりません。それはあなたが求めていたものですか? –

+0

でも、エンドポイントからの応答はjsonオブジェクトです。モデルは単純にjsonオブジェクトフィールドと一致します。 Promise ここで、Tはjsonの値を持つクラスのインスタンスをオートポピュレートするクラスです。 – tweetypi

+0

私はget のようになり、 'AnotherModel'の戻り値の型を期待しているかもしれませんが、 'AnotherModel'の変数宣言に一致するフィールドを持つ 'object'を返します... – tweetypi

答えて

0

これを書く方が良いかもしれません。

class RestService { 
    public async get<T>(func: string): Promise<T | void> { 
     return await fetch('' + func) 
      .then(response => response.json() as Promise<T>) 
      .then(data => { 
       return data; 
      }) 
      .catch(e => { 
      }); 

    } 
} 

あなたはこのlinkであまりにも遊び場でそれを見ることができます。

このようにすれば、どのような型でも上書きする必要がなくなり、コンパイラはすべての型を自分のものとして把握することができます。

catch関数は何も返さないため、戻り値の型はPromise<T | void>になりました。あなたは、エラーの場合にあなたが何をするかに応じて、何か他のものを置くこともできます。

Typescriptはdataオブジェクトを自動的に与えるタイプのTに変換しません。

たとえば、get<AnotherModel>('modelEndpoint')というメソッドを呼び出した場合、エンドポイントはModelを返します。ビルド時の型は、実行時にタイプ​​のオブジェクトを期待する必要がありますが、オブジェクトは実際にはModelの型になります。

これは質問から明らかではないが、多分、あなたの問題はdataは、前thenコールバックで返すPromise<T>するのではなく、タイプTであるという事実です。

外部のthenが呼び出される前に、then関数へのコールバックとして送信されたPromiseが最初に解決されるためです。

これはあなたのコードがと同等であることを意味します。

.then(response => response.json().then((data) => data as T)) 
.then(data => { 
    return data; 
}) 

それは約束APIがあなたのためだけにそれの世話をすることだけです。

プロミスの落とし穴について詳しくは、postをご覧ください。

関連する問題