Typescript Это выражение невозможно сконструировать. ошибка в унаследованной структуре класса

#javascript #typescript #oop

#javascript #typescript #ооп

Вопрос:

Я новичок в Typescript и пытаюсь персонализировать свои классы ошибок внутри приложения.

У меня всего четыре класса; Exception, GenericError, BaseService, CarService два основных и два унаследованных. GenericError расширяет ExceptionClass, а CarService расширяет BaseService. Я не могу изменить свойство конструктора класса GenericError. Я получаю эту ошибку;

Это выражение невозможно сконструировать.

Фрагмент TS

Что не так с моей логикой наследования классов?

 // Exception.ts
class ExceptionClass extends Error {
  status: number;
  message: string;
  errors?: object;
  constructor(status: number, message: string, errors?: object) {
    super(message);
    this.status = status;
    this.message = message;
    this.errors = errors;
  }
}
  
 // GenericError.ts
class GenericException extends ExceptionClass {
  constructor(message?: string) {
    super(400, message || 'Internal Error');
  }
}
  
 // BaseService.ts
class BaseService {
  genericError: GenericException;

  constructor(message: string) {
    this.genericError = new GenericException();
  }
}
  
 // CarService.ts
export default class CarService extends BaseService {
  constructor() {
        super('')
        console.log("CarService started!");
    }
  async checkCar() {
    return new Promise(async (resolve: any, reject: any) => {
      //** Imagine some business logic that fails */
      const passwordsNotMatchErr = new this.genericError('Fail Reason bla bla');
      return reject(passwordsNotMatchErr);
    })
  }
}
  

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

1. Просто предупреждаю, что пометка функции async и последующее возвращение обещания бессмысленны.

Ответ №1:

Проблема в том, что в следующей строке:

 const passwordsNotMatchErr = new this.genericError('Fail Reason bla bla');
  

Вы пытаетесь создать экземпляр переменной, экземпляр которой был создан в конструкторе вашего класса. Вы пытаетесь сделать что-то вроде const myString = new "I am a string and I can not be instantiated"

Когда вы делаете:

 genericError: GenericException;
  

То, что вы делаете, это определяете переменную класса, которая имеет GenericExpection тип (помните, что могут создаваться экземпляры только классов, а не переменных). Если вы хотите следовать своей архитектуре, вы можете сделать что-то вроде:

   async checkCar() {
    return new Promise(async (resolve: any, reject: any) => {
      //** Imagine some business logic that fails */
      this.genericError = new GenericException('Fail Reason bla bla');
      return reject(this.genericError);
    })
  }
  

или

   async checkCar() {
    return new Promise(async (resolve: any, reject: any) => {
      //** Imagine some business logic that fails */
      const passwordsNotMatchErr = new GenericException('Fail Reason bla bla');
      return reject(passwordsNotMatchErr);
    })
  }
  

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

1. Спасибо за ответ. Я знаю, что могу импортировать класс GenericException в начало служебного файла и использовать его, как вы предложили. Но я думаю, что вы упускаете мою точку зрения. Я пытаюсь собрать все исключения в классе, и я хочу использовать их в расширенных классах с этим .. Если я сделаю так, как вы предложили, мне придется импортировать класс genericException в каждый файл, не так ли?

2. Я вижу, что вы хотите сделать… Как насчет создания вспомогательного метода в BaseService классе, который возвращает новый экземпляр GenericException ? Это вам нужно будет только импортировать GenericException в BaseService класс и просто взаимодействовать с вспомогательным методом. Если это не имеет смысла, просто дайте мне знать, и я смогу обновить свой ответ примером @Capan