2017-04-20 14 views
1

連鎖約束を返すクラスがあり、最初の約束の型はangular.IPromise<Foo>であり、2番目の約束は型がangular.IPromise<Bar>で解決されます。連鎖した約束を返す関数の戻り型

なぜ返品タイプはdoSomethingangular.IPromise<Bar>ですか?

戻り値の型はangular.IPromise<Foo>であると私は考えていました。なぜなら、それが関数によって返される最初のものだからです。私はthen()が約束を返し、返されたものをその応答に包むことに気付いていますが、これはまだ私を混乱させています。

import { Something } from '../somewhere'; 
import { Bar } from '../somewhereelse'; 

class Test { 
    doSomething(): angular.IPromise<Bar> { 
     return Something.getFoo() // getFoo() return type angular.IPromise<Foo> 
      .then(() => { 
       let x: Bar = {};   
       return x; 
      }); 
    } 
} 

助けてください。私は、必要に応じてコードを提供しています。

+0

あなたは戻り値の型は '角度になることを理解しますか。戻り値の型として 'Bar'を宣言している場合は、IPromise '? typescriptは*実行時*の戻り値を知らないので、コードを静的に解析します*。 –

+0

戻り値の型は角度です.IPromise - 私は簡単にそれをテストできます。私は戻り値の型が角度であることを期待していました。分かりませんこれはdoSomething()関数から返される最初のものですから。 –

+2

'.then'は' .map'が 'Array'であるため' Promise'です。 –

答えて

3

最初のものは:Something.getFoo()を返さないでください。 あなたはSomething.getFoo().then(...)を返します。プロビジョニングを使用して非同期タスクを実行しても、それらは即座に返されます。 angular.IPromise返された約束を返す

then()Something.getFoo()から1しかしSomething.getFoo().then(...)

によっておよびBarオブジェクトを返しているthen()に提供するコールバックとして返されるものではありません。promise.ten(foo=>return new Bar())あなたの文は、実際にPromise<Bar>オブジェクトを返します。

@TsatsuyukiIshiに述べたように、これはangular.IPromise.thenの型定義である:

then<X>(successCallback: (promiseValue: T) => IPromise<X>|X, ...): IPromise<X> 

この方法は一般的であり、その戻り型(X)がパラメータ((promiseValue: T) => IPromise<X>|X)として提供されるタイプに依存します。

あなたはBarXを交換した場合、これは明白です:

then(successCallback: (promiseValue: T) => IPromise<Bar>|Bar, ...): IPromise<Bar> 
2

コードがコンパイルされている場合、これはangular.IPromise<Bar>を返します。

インターフェイスは任意の数のクラスにマップでき、接頭辞はIの接頭辞で簡単に識別できます。

具体的な型はPromiseの実装の詳細ですが、解決時にBarを返す限り、IPromise<Bar>を満たします。

EDIT:TypeScriptは、テンプレートパラメータthen<TResult>(successCallback: (promiseValue: T) => IPromise<TResult>|TResult, ...): IPromise<TResult>でそれを決定します。これは、コールバックの戻り値の型を静的に決定します。 source

も参照してください:Whats the difference between "declare class" and "interface" in TypeScript

+0

私の質問に完全に答えているのか分かりません。私は "私はなぜ返りのタイプのangular.IPromise と角度です.IPromise "と尋ねていると思います。 getFoo()の呼び出しはangular.IPromise を返します。これがdoSomething()によって返される最初のものです。なぜ関数の戻り値型ではないのですか? –

+0

@DaveCooperご要望により説明を追加しました。これがあなたの必要性を満たすなら、私はあなたが答えを受け入れることに感謝します。 –

-6

を使用すると、結果は異なる型を返す必要がある場合、あなたはanyタイプを使用することができます。 typescriptは100%強く型付けされた言語ではありません。タイプは実行時に変更できます。実際には、リゾルバからのパラメータは無視され、コールバックは期待通りに型を返しました。

+6

ひどいアドバイス-1 –

関連する問題