为了账号安全,请及时绑定邮箱和手机立即绑定

TypeScript 类继承的行为与其 ES6 等效项不同

TypeScript 类继承的行为与其 ES6 等效项不同

繁花如伊 2023-08-05 19:38:23
我正在使用express和TypeScript项目为node.js构建一个错误处理中间件。在其中我有一个AppError扩展的类Error。它看起来像这样:class AppError extends Error {  public readonly internalCode: number | undefined;  public readonly httpCode: number;  public readonly message: string;  constructor(httpCode: number, message: string, internalCode?: number) {    super();    this.internalCode = internalCode;    this.message = message;    this.httpCode = httpCode;  }  public generateReport(): GenericReport {    return {      code: this.internalCode,      message: this.message,    };  }}我目前正在使用以下中间件将其放入new AppError()一条路线中:/errorerrorHandlerfunction errorHandler(err: Error, request: Request, response: Response, next: NextFunction,): Response {  if (err instanceof AppError) {    const report = err.generateReport();    return response.status(err.httpCode).json(report);  }  return response.status(500).json(err);}在中间件内部,我试图AppError在err[[Prototype]] 链上查找,但在 TypeScript 代码中验证总是失败。然而,用 Babel 转译它并用 运行 JS 版本后node,err instanceof AppError解析为true. 为什么TS代码里没有呢?在上面的示例中,Object.getPrototypeOf(err)返回 me Error {},并将err类型更改为AppErrororany不会影响结果。据我了解,新构造的对象(new AppError()运行后)应该 [[Prototype]] 链接到AppError. curl http://localhost:3333/error在 TS 服务器上运行时,我得到{ "internalCode": 1, "message": "This is an error", "httpCode": 500 },这意味着它err确实是由AppError().
查看完整描述

1 回答

?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

我看了你的代码。一些评论:

  1. 切换到更高版本的 ecmascript 输出可能会解决此问题,因为您的输出现在不会生成类,因为 EcmaScript 5 还没有它们。

  2. 最好不要使用ts-node 工具,特别是当您尝试调试类似的东西时。它可以给出时髦的结果,并且能够查看正在执行的真实 JavaScript 真是太好了。

  3. 我查看了您的存储库,我相信您应该只用于instanceof您想要做的事情。我认为出于错误中间件的目的,instanceof 更有意义。

查看完整回答
反对 回复 2023-08-05
  • 1 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信