Javascript TypeScript类继承的行为与其ES6等效类不同
我正在使用express和TypeScript项目为node.js构建一个错误处理中间件。在它里面我有一个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
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中的目标。非常感谢你。我花了最后一个小时在这件事上,但我还没有想过。