【问题标题】:Return type of a function that returns a chained promise返回链式承诺的函数的返回类型
【发布时间】:2017-09-16 20:47:10
【问题描述】:

我有一个返回链式 promise 的类,第一个 promise 的类型是 angular.IPromise<Foo>,第二个 promise 用类型 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; 
            });
    }
}

任何帮助将不胜感激。如果需要,我很乐意提供更多代码。

【问题讨论】:

  • 如果您将Bar 声明为返回值的类型,您如何计算返回类型将为angular.IPromise&lt;Foo&gt;? typescript 不知道 runtime 返回值,它静态地分析代码
  • 返回类型是 angular.IPromise - 我可以很容易地测试它。我期望返回类型是 angular.IPromise 因为这是 doSomething() 函数返回的第一件事。
  • .thenPromise 就像 .mapArray

标签: javascript angular typescript strong-typing


【解决方案1】:

第一件事是:你不返回Something.getFoo()。 你返回Something.getFoo().then(...)。即使 promise 用于执行异步任务,它们也会立即返回。

then() 返回一个angular.IPromise 返回的承诺不是来自Something.getFoo() 的承诺,而是Something.getFoo().then(...) 返回的承诺

并且提供给then() 的回调返回一个Bar 对象:promise.ten(foo=&gt;return new Bar()) 您的语句实际上返回一个Promise&lt;Bar&gt; 对象。

正如@TsatsuyukiIshi 所说,这是angular.IPromise.then 的类型定义:

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

此方法是通用的,其返回类型 (X) 取决于作为参数提供的类型 ((promiseValue: T) =&gt; IPromise&lt;X&gt;|X)。

如果将X 替换为Bar,这很明显:

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

【讨论】:

    【解决方案2】:

    这将返回 angular.IPromise&lt;Bar&gt;,前提是代码可以编译。

    接口可以映射到任意数量的类,并且可以通过带有I前缀的名称轻松识别。

    具体类型将是 Promise 实现的细节,但是只要它在解析时返回 Bar,它就满足 IPromise&lt;Bar&gt;

    编辑:TypeScript 通过then&lt;TResult&gt;(successCallback: (promiseValue: T) =&gt; IPromise&lt;TResult&gt;|TResult, ...): IPromise&lt;TResult&gt; 中的模板参数确定它。这将静态确定回调的返回类型。 source

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

    【讨论】:

    • 我不确定这是否完全回答了我的问题。我想我在问“为什么返回类型是 angular.IPromise 而不是 angular.IPromise”。对 getFoo() 的调用返回 angular.IPromise,这是 doSomething() 返回的第一件事,那为什么不是函数的返回类型呢?
    • @DaveCooper 我已应您的要求添加了解释。如果这满足您的需要,我将不胜感激您接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2017-04-05
    • 1970-01-01
    • 2017-05-11
    相关资源
    最近更新 更多