#javascript #typescript #oop
#javascript #typescript #ооп
Вопрос:
Я новичок в Typescript и пытаюсь персонализировать свои классы ошибок внутри приложения.
У меня всего четыре класса; Exception, GenericError, BaseService, CarService два основных и два унаследованных. GenericError расширяет ExceptionClass, а CarService расширяет BaseService. Я не могу изменить свойство конструктора класса GenericError. Я получаю эту ошибку;
Это выражение невозможно сконструировать.
Что не так с моей логикой наследования классов?
// 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