TypeScript错误的承诺使用回调函数的返回值解析了推断类型



请注意,代码的某些部分与AmCharts有关,但问题本身可能与TypeScript本身更相关。

下面是JS函数在AmCharts库中所做的:

export function createDeferred(callback, scope) {
var rest = [];
for (var _i = 2; _i < arguments.length; _i++) {
rest[_i - 2] = arguments[_i];
}
return new Promise(function (resolve, reject) {
registry.deferred.push({
scope: scope,
callback: callback,
args: rest,
resolve: resolve
});
if (registry.deferred.length == 1) {
processNextDeferred();
}
});
}
function processNextDeferred() {
var _a;
var next = registry.deferred[0];
if (next) {
var sprite_2 = (_a = next.callback).call.apply(_a, __spread([next.scope], next.args));
sprite_2.events.on("ready", function () {
next.resolve(sprite_2);
registry.deferred.shift();
if (options.deferredDelay) {
setTimeout(processNextDeferred, options.deferredDelay);
}
else {
processNextDeferred();
}
});
}
}

但重要的部分是我的回调函数在哪里执行,然后解析:

lib如何调用和解析:

var sprite_2 = (_a = next.callback).call.apply(_a, __spread([next.scope], next.args));
next.resolve(sprite_2);

next.callback是来自我这边的以下函数:

export function createChartInstance<T extends am4charts.Chart>(
chartId: string,
chartType: new () => T
): T {
const chart = am4core.create(chartId, chartType);
return chart; // returns instance of specified chart, like XYChart
}
const x = await am4core.createDeferred(
createChartInstance,
chartId,
am4charts.XYChart,
);

那么,按照逻辑,x也应该是am4charts.XYChart,对吗?因为这是兑现承诺的回报。但它是am4core.Sprite型的。为什么?即使createDeferred声明是:

export declare function createDeferred(callback: (...args: Array<any>) => Sprite, scope?: any, ...rest: Array<any>): Promise<Sprite>;

解析的确实是图表的类型,不是吗?

使用as关键字解决。

最新更新