Jquery承诺链接+;Typescript=类型不匹配

Jquery承诺链接+;Typescript=类型不匹配,jquery,typescript,promise,Jquery,Typescript,Promise,我在尝试将jQuery承诺链接到TS时遇到了一些困难。然后 请参见下面的我的代码: function first(): JQueryPromise<string> { return $.when('1'); } function test() { $.when() .then(() => { return first(); }) .then((value) =>

我在尝试将jQuery承诺链接到TS时遇到了一些困难。然后

请参见下面的我的代码:

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

function test()
{
    $.when()
        .then(() =>
        {
            return first();
        })
        .then((value) =>
        {
            var str: string = value; //<--- type mismatch here.
        });
}
function first():JQueryPromise
{
返回$.when('1');
}
功能测试()
{
$.when()
.然后(()=>
{
先返回();
})
。然后((值)=>
{

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

.then<string>(() =>
{
    return first();
})
。然后(()=>
{
先返回();
})

另外,如果您有很多关于承诺的工作要做,我很谦虚地建议您使用一个库,如.Q更接近作为ES6承诺基础的承诺/a+规范,它是一个定义更简单的库,因此类型推断在TypeScript中工作得更好,并且它提供了一系列有用的帮助工具,如
Q.all

您的用法看起来不错。承诺的类型推断不好/很难尝试显式键入。我以前也有同样的问题。奇怪的是,在检查定义文件时,没有定义与VS的IntelliSense显示的或编译器抱怨的签名相匹配。我不知道TypeScript IntelliSense是否ense是由编译器提供动力的,但如果是这样,我怀疑这是一个编译器错误。@BenjaminGruenbaum您的意思是要执行以下操作:。然后((value:string)=>{var str:string=value;});@OliverWeichhold这是一个类型错误。JavaScript承诺既是map又是flatMap,
那么
可以是
Promise->T->Promise->Promise
或者
Promise->T->U->Promise
,所以当你从
返回一个承诺时,编译器无法判断你正在使用哪个重载,因为你可能正在使用一个承诺例如,如果你的
。那么
返回一个承诺`它不知道它返回的是
承诺
还是
承诺
(是
U
a
承诺
还是
承诺
U
字符串
?)实际上我一点也没觉得这么糟糕:-)