如何使用 TypeScript 在 Dojo 中调用 xhr

How to call xhr in Dojo using TypeScript

我正在使用 Typescript(新手)和 Dojo,我需要进行异步调用。当您不使用 TypeScript 时,这非常容易。但是,编译器让事情变得更难了,尤其是因为我不允许 "implicit any"。我也喜欢 lambda 风格的回调,但编译器也抱怨那里的 "implicit any"。大多数情况下,我对 Deferred 和 Promise 以及如何导入 promise 模块感到困惑。

有 Typescript/Dojo 经验的人可以告诉我我是否做对了吗?还有,有什么办法可以改善吗?

import xhr = require("dojo/request/xhr");

private getDataAsync(url:string, param:any):dojo.promise.Promise {
    var deferred = new Deferred();
    var options: any = {
        handleAs: 'json',
        query: {
            'param': param
        }
    };
    xhr.get(url, options).then(
        lang.hitch(this, function(data:any) {
            var returnValue = this.doSomething(data);
            deferred.resolve(returnValue);
        }),
        function(err:any) {
            deferred.reject(err, true);
        }
    );
    return deferred.promise;
}

而且,我这里还需要用到Dojo的xhr吗?是否有内置于 TypeScript 中的东西以浏览器中立的方式包装 XMLHTTPRequest,就像 dojo 那样?

Is there something built into TypeScript that wraps XMLHTTPRequest in a browser-neutral way

没有。 TypeScript 具有 非常 最小的运行时环境,仅用于帮助编译器生成有效代码(几乎只有 __extends 函数)。

I also like the lambda-style callbacks, but the compiler complained about the "implicit any" there, too

这很自然。编译器不知道 XHR 的结果,如果你知道它使用一些接口指定它,或者你可以告诉编译器你不想要类型安全并使用 any 正如你已经在做的那样。

更新 1

I'm still stuck on the differences between dojo.promise.Promise, deferred.promise, and Deferred

承诺就是承诺:https://github.com/promises-aplus/promises-spec

Deferred 具有 promise (.promise) 以及漂亮的句柄(.resolve.reject)来确定所述 promise.

我认为问题是 dojo.d.ts 中的 DeferredPromise 类 似乎早就应该更新了。它们没有结果类型的通用类型参数,并且 then 回调只是 Function,因此它们不捕获任何有关函数形状的信息。这没有利用 TypeScript 1.0,更不用说 1.4。

es6-promise.d.ts比较,其中Promise<R>有一个方法then<U>,其中R是promise出来的值,Uthen 的解析处理程序产生的值,因此下一个承诺将是 Promise<U>。所以 promise 的操作链是强类型的,一切都很好。

如果您对 dojo.d.ts 进行类似的改进并向他们设置拉取请求,他们可能会非常感激! :)