【问题标题】:TypeScript wrong promise resolved inferred type using the returned value of a callback functionTypeScript 错误的 promise 使用回调函数的返回值解析了推断类型
【发布时间】: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&lt;Sprite&gt;,这就是为什么它是Sprite 类型的原因,不是吗?实现无所谓,你真的不应该看你一开始写的JS代码。 Typescript 完全忽略它,只查看类型声明,如果类型声明说它返回 Sprite,则 typescript 说它返回 Sprite,即使事实并非如此

标签: typescript amcharts amcharts4


【解决方案1】:

使用as 关键字解决了这个问题。

【讨论】:

    猜你喜欢
    • 2019-09-03
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2019-12-06
    • 2019-01-07
    • 2020-01-23
    • 2019-08-21
    • 2020-06-06
    相关资源
    最近更新 更多