【问题标题】:Typescript - "... is not a function or its return value is not iterable"打字稿-“...不是函数或其返回值不可迭代”
【发布时间】:2019-08-09 15:19:03
【问题描述】:

我有这个辅助函数:

export function to(promise: Promise<any>) {
  return promise
    .then((data: any) => [null, data])
    .catch((err: Error) => [err, null]);
}

这个函数(理论上)应该可以帮助我在函数中使用await 时发现错误。例如:

const [err, data] = await to(validate(card));

问题是在运行时,我收到以下错误:

to 不是函数或其返回值不可迭代

虽然预期的返回签名应该是Promise&lt;[Error, null]&gt; Promise&lt;[null, Error]&gt;,但它看起来像返回(同样,理论上,因为它实际上失败了):Promise&lt;any[] | Error[]&gt;

我错过了什么?

【问题讨论】:

  • 我认为您的 validate 呼叫应该是对 to 的呼叫,对吧?
  • @ShamPooSham 你是对的。我的错。我已经更新了我的问题
  • 你能举一个发生这种情况的小例子吗?
  • 我在纯 Javascript 中遇到了完全相同的错误,因为被调用函数中的一个分支错误地返回了单个元素而不是数组。

标签: javascript typescript promise


【解决方案1】:

我认为问题是由鸭子类型引起的,TypeScript 无法从表达式中正确猜测返回类型。

你可以明确输入:

function to(promise: Promise<any>): Promise<[Error, any]> {
    return promise
        .then((data: any) => [null, data] as [Error, any])
        .catch((err: Error) => [err, null] as [Error, any]);
}

【讨论】:

    猜你喜欢
    • 2019-08-10
    • 2021-04-12
    • 2019-11-01
    • 2020-08-29
    • 2022-10-14
    • 2019-10-12
    • 2023-03-15
    • 1970-01-01
    • 2018-10-05
    相关资源
    最近更新 更多