我正在使用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().
TypeScript 類繼承的行為與其 ES6 等效項不同
繁花如伊
2023-08-05 19:38:23