【问题标题】:Jquery Promises Chaining + Typescript = Type MismatchJquery Promises Chaining + Typescript = 类型不匹配
【发布时间】:2014-10-18 23:53:33
【问题描述】:

在尝试将 jQuery Promises 与 .then 链接时,我在 TS 上遇到了一些困难

请参阅下面的代码:

function first(): JQueryPromise<string>
{
    return $.when('1');
}

function test()
{
    $.when()
        .then(() =>
        {
            return first();
        })
        .then((value) =>
        {
            var str: string = value; //<--- type mismatch here.
        });
}

Typescript 期望该值的类型是 JQueryPromise 而不是“字符串”。

如果我将价值赋予任何东西,我就能让它发挥作用。

是否有不同的实现方式,或者JQuery定义文件有错误?

谢谢

【问题讨论】:

  • 您的使用情况看起来不错。 Promise 的类型推断不好/很难尝试显式输入。
  • 我以前也有同样的问题。奇怪的是,在检查定义文件时,没有定义 then 匹配 VS 的 IntelliSense 显示或编译器抱怨的 then 的签名。我不知道 TypeScript intellisense 是否由编译器提供支持,但如果是,我怀疑它是编译器错误。
  • @BenjaminGruenbaum 你的意思是执行以下操作:.then((value: string) => { var str: string = value; });
  • @OliverWeichhold 这是一个类型错误。 JavaScript Promise 既是 map 又是 flatMap,then 可以是 Promise&lt;T&gt; -&gt; T -&gt; Promise&lt;U&gt; -&gt; Promise&lt;U&gt;Promise&lt;T&gt; -&gt; T -&gt; U -&gt; Promise&lt;U&gt;,所以当你从 then 返回一个 Promise 时,编译器无法判断你正在使用哪个重载,因为你可能是使用诺言的诺言。例如,如果您的 .then 返回一个 Promise`,它不知道它的返回是 Promise&lt;string&gt; 还是 Promise&lt;Promise&lt;string&gt;&gt;(是 UPromise&lt;string&gt; 还是 Promise&lt;U&gt;Promise&lt;string&gt; 和 @ 987654333@ 是string ?)
  • 其实我并没有觉得它那么糟糕 :-)

标签: jquery typescript promise


【解决方案1】:

JQuery promises在DefinitelyTyped定义文件中有一个复杂的结构,因为JQuery promises本身有一个复杂的结构/历史。您应该能够通过提供泛型参数而不是依赖推理来帮助编译器选择正确的重载:

.then<string>(() =>
{
    return first();
})

另外,如果你有很多工作需要处理 Promise,我很谦虚地建议使用像 Q.js 这样的库。 Q 更接近作为 ES6 Promise 基础的 Promises/A+ 规范,它是一个更简单的定义库,因此类型推断在 TypeScript 中往往工作得更好,并且它提供了一堆有用的帮助工具,例如 Q.all

【讨论】:

    猜你喜欢
    • 2014-09-24
    • 2019-10-19
    • 2020-08-10
    • 2021-12-21
    • 2013-01-06
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多