2017-04-20 133 views
1

我有一個返回鏈接承諾的類,第一個承諾的類型爲angular.IPromise<Foo>,第二個承諾的類型爲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

你怎麼計算,返回類型是'角。IPromise '如果你聲明'Bar'作爲返回值的類型?打字稿不知道* runtime *返回值,它靜態分析代碼*。 –

+0

返回類型是angular.IPromise - 我可以很容易地測試。我期待返回類型是angular.IPromise ,因爲這是doSomething()函數返回的第一件事。 –

+2

'.then'是'Promise','.map'是'Array'。 –

回答

3

的第一件事是:你不回Something.getFoo()。 您將返回Something.getFoo().then(...)。即使承諾用於執行異步任務,它們也會立即返回。

then()返回angular.IPromise返回的承諾是不Something.getFoo()一但Something.getFoo().then(...)

,併爲提供給then()返回一個Bar對象回調返回的一個: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)中提供的類型。

如果通過Bar更換X這是顯而易見的:

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

這將返回angular.IPromise<Bar>,所提供的代碼編譯。

接口可以映射到類的任何量,並且它們可以與I前綴名稱容易地識別。

具體類型將是Promise實現的細節,但只要它在解析上返回Bar,它就滿足IPromise<Bar>

編輯:打字稿經由then<TResult>(successCallback: (promiseValue: T) => IPromise<TResult>|TResult, ...): IPromise<TResult>模板參數確定它。這將靜態確定回調的返回類型。 source

另見:Whats the difference between "declare class" and "interface" in TypeScript

+0

我不確定完全回答我的問題。我想我問「爲什麼是返回類型angular.IPromise 而不是angular.IPromise 」。調用getFoo()返回angular.IPromise ,這是doSomething()返回的第一件事情,爲什麼不是函數的返回類型? –

+0

@DaveCooper我已經在您的要求下添加了解釋。如果能滿足您的需求,我將非常感激您接受答案。 –

-6

如果您需要從結果返回不同類型的,那麼你可以使用any類型。打字稿不是100%強類型的語言。該類型可以在運行時更改。實際上解析器的參數只是被忽略,回調函數按照預期返回了類型。

+6

可怕的建議-1 –