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

sndmnn

我正在为带有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()在一条/error路由中进行捕获errorHandler

function 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);
}

我试图AppErrorerr[[Prototype]]链找到中间件,但是在TypeScript代码中验证总是失败。但是,在使用Babel对其进行编译并使用来运行JS版本后nodeerr instanceof AppError解析为true为什么在TS代码中没有显示?

在以上示例中,Object.getPrototypeOf(err)返回me Error {},并将err类型更改AppErrorany不影响结果。

据我了解,应该将新构造的对象(new AppError()运行)链接到[[Prototype]] AppErrorcurl http://localhost:3333/error在TS服务器上运行{ "internalCode": 1, "message": "This is an error", "httpCode": 500 },这意味着它err确实是由创建的AppError()

该GitHub存储库中有一个解决问题的有效示例对此主题的任何澄清将不胜感激。

翻转

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

  1. 切换到更高版本的ecmascript输出可能会解决此问题,因为您的输出目前不会生成类,因为EcmaScript 5还没有它们。
  2. 最好不要使用ts节点工具,尤其是在尝试调试类似工具时。它可以给出时髦的结果,而且很高兴能够查看正在执行的真正javascript。
  3. 我看了一下您的回购,并且相信您可能应该只将其instanceof用于尝试做的事情。我认为出于您的错误中间件的目的,instanceof更具意义。

如果您有兴趣,我还编写了一个错误处理中间件,该中间件做了类似的事情:

https://github.com/curveball/problem/blob/master/src/index.ts

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ES6类在ExpressJS中的行为有所不同吗?

来自分类Dev

ES6具有多个变量类型的解构分配

来自分类Dev

ES6具有多个变量类型的解构分配

来自分类Dev

从非类继承ES6 / TS类

来自分类Dev

ES6类多重继承

来自分类Dev

ES6类继承的性能

来自分类Dev

具有可变参数的ES6类super()

来自分类Dev

具有打字稿的静态类继承的super等效项

来自分类Dev

Typescript不允许具有不同构造函数签名的类的typeof继承

来自分类Dev

以不同的名称导入ES6类

来自分类Dev

片段是否应该与其使用的活动具有不同的类?

来自分类Dev

片段是否应该与其使用的活动具有不同的类?

来自分类Dev

ES6 OOP 从父类继承方法

来自分类Dev

ES6 类继承/扩展流类型

来自分类Dev

Node.js导出的行为与ES6模块不同

来自分类Dev

使用 es6 导入时 lodash pick 的行为不同

来自分类Dev

ES6 / ES7扩展具有相同名称的类

来自分类Dev

在ES6类中具有私有属性和方法

来自分类Dev

如何将具有多个行为的类与其他类相关联?

来自分类Dev

具有不同构造函数的继承类

来自分类Dev

ES6多重继承?

来自分类Dev

如何将具有成员变量的React组件重构为es6类

来自分类Dev

使用ES6检查NodeList中的任何元素是否具有特定的类

来自分类Dev

如何判断ES6类是否具有给定名称的吸气剂?

来自分类Dev

为什么在具有getters / setter方法的Es6类中无法进行记忆化?

来自分类Dev

具有数据映射ES6的动态类名

来自分类Dev

TypeScript + ES6 Map +对象类型的索引签名隐式具有“ any”类型

来自分类Dev

如何使具有自己类的<a>项目与其他项目具有不同的颜色?

来自分类Dev

是否可以将ES6类用作Typescript类型?

Related 相关文章

热门标签

归档