【发布时间】:2021-08-13 22:24:34
【问题描述】:
请注意,代码的某些部分与 AmCharts 有关,但问题本身可能与 TypeScript 本身更相关。
这是 AmCharts 库中的 JS 函数正在执行的操作:
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 对吧?因为它是已解决的 Promise 的返回。但它的类型是am4core.Sprite。为什么?即使createDeferred 声明是:
export declare function createDeferred(callback: (...args: Array<any>) => Sprite, scope?: any, ...rest: Array<any>): Promise<Sprite>;
resolved 确实是图表的类型,不是吗?
【问题讨论】:
-
如果我理解正确,您提供的最后一个代码 sn-p 是您在库中看到的
createDeferred的类型声明。它明确表示createDeferred返回Promise<Sprite>,这就是为什么它是Sprite类型的原因,不是吗?实现无所谓,你真的不应该看你一开始写的JS代码。 Typescript 完全忽略它,只查看类型声明,如果类型声明说它返回Sprite,则 typescript 说它返回Sprite,即使事实并非如此
标签: typescript amcharts amcharts4