【问题标题】:Typescript can't create interface for catch(err)Typescript 无法为 catch(err) 创建接口
【发布时间】:2021-08-09 11:25:51
【问题描述】:

我正在使用带有猫鼬的节点。记录错误后,我想“好吧,让我们通过访问 Object.keys(err) 返回错误数组”。

我用接口定义的参数数据编写了外部函数:

export interface mongoError {
    errors: errors
}

interface errors {
    [index: string]: Object
}

getError = (err: mongoError) => {
    ...
    Object.keys(err.errors).forEach(....
}

我通过以下方式向它发送数据:

    mongooElement = new element(this.data)
    try {
        await mongooElement.save()
        return NewItem
    } catch (err) {
        return this.getError(err)
    }

尝试更改 catch 中的错误类型后,我总是遇到错误:

如果指定了 ts(1196),则 Catch 子句变量类型注解必须为 any 或 unknown

【问题讨论】:

  • 您是否尝试向err 添加类型注释?
  • @VLAZ 是的。没有任何内容但在 getError 中定义了错误,打字稿向我显示任何不能是 Object 的错误。但是,一旦我将类型添加到 err “mongoError”,它就会向我显示这篇文章底部的错误。现在我正在使用“any”,但我不知道如何让它工作

标签: javascript node.js typescript mongodb


【解决方案1】:

https://github.com/Microsoft/TypeScript/issues/20024

这个问题仍然存在,据我所知,在 catch 上使用类型注释是不可能的。

但是,从 typescript 4 开始,它允许使用 catch(error: unknown)

还有:https://github.com/Microsoft/TypeScript/issues/8677#issuecomment-220385124

解释在错误上使用类型非常困难,因为即使您尝试强制转换或检查它,您仍然无法确定它是否是一些随机系统内存错误(或其他什么)而不是您所遇到的错误期待。因此,即使您对 MongoError 进行某种检查,它也会突然引发系统内存错误,从而破坏了在错误上使用类型的意义。

【讨论】:

    【解决方案2】:

    在编译类型时不可能知道err 的类型是什么,因为几乎可以抛出任何东西,而且你无法提前知道是什么导致触发捕获。我认为这就是您从 TS 得到的错误。

    如果您想处理特定的错误类型,请考虑使用运行时检查,例如使用instanceof,这将帮助 TS 了解您正在处理的类型,并帮助您的代码更加健壮如果您遇到不同类型的错误,例如:

    mongooElement = new element(this.data)
        try {
            await mongooElement.save()
            return NewItem
        } catch (err) {
            if (err instanceof MongoError) {
               // here typescript knows that err is definitely a `MongoError`
               return this.getError(err)
            } else {
              handleOtherError(err);
            }
        }
    

    需要注意的是,由于 instanceof 实际上是运行时检查(不是 TS 关键字),MongoError 必须是具体类型(例如,存在于编译的 JS 代码和运行时的实际类) ,而不仅仅是一个 Typescript 界面。我相信node js mongodb库定义了MongoError,不确定是否可以通过mongoose访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      相关资源
      最近更新 更多