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

Javascript TypeScript类继承的行为与其ES6等效类不同,javascript,node.js,typescript,express,prototype,Javascript,Node.js,Typescript,Express,Prototype,我正在使用express和TypeScript项目为node.js构建一个错误处理中间件。在它里面我有一个AppError类,它扩展了Error。看起来是这样的: class AppError extends Error { public readonly internalCode: number | undefined; public readonly httpCode: number; public readonly message: string; construct

我正在使用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,
    };
  }
}
我目前正在一个
/error
路由中抛出
newapperror()
,以使用以下中间件
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);
}
在中间件内部,我试图在
err
[[Prototype]]链上找到
AppError
,但在TypeScript代码中验证总是失败。但是,在使用Babel传输它并使用
节点运行JS版本后,
err instanceof AppError
解析为
true
。为什么它不在TS代码中

在上面的示例中,
Object.getPrototypeOf(err)
返回我
Error{}
,将
err
类型更改为
AppError
any
不会影响结果

据我所知,新构造的对象(在
newapperror()
运行之后)应该[[Prototype]]]链接到
AppError
。并运行
curlhttp://localhost:3333/error
当TS服务器打开时,我得到
{“internalCode”:1,“消息”:“这是一个错误”,“httpCode”:500}
,这意味着
err
确实是由
AppError()创建的


有一个例子说明了这个问题。对此主题的任何澄清都将不胜感激。

我查看了您的代码。几点意见:

  • 切换到以后的ecmascript输出可能会解决这个问题,因为您的输出现在不会生成类,因为ecmascript 5还没有这些类
  • 最好不要使用ts节点工具,尤其是当您尝试调试类似的东西时。它可以给出令人毛骨悚然的结果,能够看到正在执行的真实javascript也很不错
  • 我看了一下你的回购协议,我认为你应该用
    instanceof
    来做你想做的事情。我认为对于错误中间件来说,instanceof更有意义
  • 如果您感兴趣,我还编写了一个错误处理中间件,它可以做类似的事情:


    什么是typescript代码中的失败?您并没有真正运行typescript代码。它被转换成Javascript。你看过输出了吗?可能会给你一个提示。您的输出是
    es5
    ,这可能是有问题的,因为它在类之前,其中包含一个东西。@Evert是的。。。那是我的问题。我把es5作为Tconfig中的目标。非常感谢你。我花了最后一个小时在这件事上,但我还没有想过。