Наследование класса TypeScript ведет себя иначе, чем его эквивалент ES6

#javascript #node.js #typescript #express #prototype

#javascript #node.js #typescript #выразить #прототип

Вопрос:

Я создаю промежуточное программное обеспечение для обработки ошибок для node.js с проектом express и TypeScript. Внутри него у меня есть 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);
}
  

Внутри промежуточного программного обеспечения, которое я пытаюсь найти AppError в err цепочке [[Prototype]], но проверка всегда завершается ошибкой в коде TypeScript. Однако после переноса его с помощью Babel и запуска версии JS с node , err instanceof AppError разрешается true . Почему этого нет в коде TS?

В приведенном выше примере Object.getPrototypeOf(err) возвращает me Error {} , а изменение err типа на AppError or any не влияет на результат.

Насколько я понимаю, вновь созданный объект (после new AppError() запуска) должен быть связан с [[Прототипом]] AppError . И я получаю, что это означает, что это действительно создано . curl http://localhost:3333/error { "internalCode": 1, "message": "This is an error", "httpCode": 500 } err AppError()

В этом репозитории GitHub есть рабочий пример проблемы. Любые разъяснения по этой теме будут с благодарностью приняты.

Комментарии:

1. Что значит сбой в коде typescript? На самом деле вы не запускаете код typescript. Он преобразуется в Javascript. Вы смотрели на результат? Может дать вам подсказку. Может быть проблематичным, что ваш вывод находится es5 перед классами, где вещь.

2. @Evert да … это была моя проблема. У меня был es5 в качестве цели в tsconfig. Большое вам спасибо. Я потратил на это целый час, и это даже не приходило мне в голову.

Ответ №1:

Я взглянул на ваш код. Несколько комментариев:

  1. Переключение на более поздний вывод ecmascript может исправить это, поскольку ваш вывод не генерирует классы прямо сейчас, потому что в ECMAScript 5 их еще не было.
  2. Рекомендуется не использовать инструменты ts-node, особенно когда вы пытаетесь отладить что-то вроде. Это может дать потрясающий результат, и приятно просто иметь возможность смотреть на реальный выполняемый javascript.
  3. Я взглянул на ваш репозиторий и считаю, что вам, вероятно, следует просто использовать instanceof для того, что вы пытаетесь сделать. Я думаю, что для целей вашего промежуточного программного обеспечения с ошибками instanceof имеет немного больше смысла.

Если вам интересно, я также написал промежуточное программное обеспечение для обработки ошибок, которое выполняет аналогичную функцию:

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