返回承诺会在 TypeScript 中给出"Supplied parameters do not match"



我在转换一个jQuery插件使用promises而不是callbacks的中间。这应该是非常基本的,但不确定问题是我链接承诺的方法,我的返回类型,还是TypeScript过于繁琐。

我一直得到这个错误:

Error   27  Supplied parameters do not match any signature of call target:
    Type '(value: {}) => {}' requires a call signature, but type 'JQueryPromise<any>' lacks one.

我的函数的简化版本如下:

    _navigate(forward: boolean, $panel: JQuery, target: string): JQueryPromise<any>
    {
        var dfd = $.Deferred();
        switch (target)
        {
            // '_self' is a full page load link
            case '_self':
                setTimeout(function ()
                {
                    window.location.href = url;
                }, 0);
                // Return empty promise - as we are about to lose the page
                dfd.resolve(true);
                break;
            // _back re-displays a panel already loaded
            case '_back':
                // Fetch a reference to the panel before this one
                var $existingPanel = THIS._getNextPanel($panel, false);
    // >>>> ERROR ON NEXT LINE <<<<<<
                // This will animate back in the previous panel - promise on complete
                dfd = dfd.then(THIS._gotoPanel($existingPanel, false, true, target));
                break;
    // [SNIP]
        }
        return dfd.promise();
    }

_gotoppanel只是另一个方法,也返回JQueryPromise<any>承诺:

    _gotoPanel($panel: JQuery, forward: boolean, transition: boolean, target?: string): JQueryPromise<any>

最终版本需要能够链接任何数量的方法和$.ajax调用的承诺,但我一直打这个错误。如果不是JQueryPromise<any>,我的返回类型应该是什么?

如果不是JQueryPromise<any>,返回类型应该是什么?

正如错误消息'(value: {}) => {}' requires a call signature所说,您需要将回调传递给.then(),而不是承诺!

我想你只是想

dfd = THIS._gotoPanel($existingPanel, false, true, target);

作为dfd,否则在_back情况下根本无法解析

未测试,但我猜您需要向then提供类型信息,例如then<any>

如果你不这样做,jQuery将在then

内的函数返回类型周围包装另一个JQueryPromise

无论如何,我个人不会将方法包装在$.Deferred()中,而是宁愿返回$.when(true)而不是dfd.resolve(true),并直接返回THIS._gotoPanel(...)

编辑

var d = $.Deferred(); d = d.then(blah); return d.promise()不飞

如果在Deferred中换行,沿着以下行:

_navigate(forward: boolean, $panel: JQuery, target: string): JQueryPromise<any>
{
    return $.Deferred(dfd => {
        switch (target) {
            // '_self' is a full page load link
            case '_self':
                ....
                dfd.resolve(true);
                break;
            case '_back':
                THIS._gotoPanel($existingPanel, false, true, target)).then(
                    ()  => { dfd.resolve(whatever); },
                    err => { dfd.reject(err); }
                )
                break;
          }
     }).promise();
}

相关内容

最新更新