【问题标题】:Typescript This expression is not constructable. error on inherited class structure打字稿这个表达式是不可构造的。继承类结构错误
【发布时间】:2020-10-10 21:40:17
【问题描述】:

我是 Typescript 的新手,我正在尝试在应用程序中个性化我的错误类。

我总共有四门课; ExceptionGenericErrorBaseServiceCarService 两个主要和两个继承。 GenericError 扩展了 ExceptionClass 并且 CarService 扩展了 BaseService。我无法更改 GenericError 类的构造函数属性。我收到此错误;

这个表达式是不可构造的。

TS Snippet

我的类继承逻辑有什么问题?

// 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);
    })
  }
}

【问题讨论】:

  • 只是提醒一下,将函数标记为异步然后返回一个承诺是没有意义的。

标签: javascript typescript oop


【解决方案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);
    })
  }

【讨论】:

  • 感谢您的回答。我知道我可以在服务文件的顶部导入 GenericException 类并按照您的建议使用它。但我认为你错过了我的观点。我正在尝试收集类中的所有异常,并且我想在带有 this. 的扩展类中使用它们。如果我按照你的建议做,我必须在每个文件中导入 genericException 类,不是吗?
  • 我知道你想做什么...在BaseService 类中创建一个返回GenericException 的新实例的帮助方法怎么样?这您只需要在BaseService 类上导入GenericException 并与辅助方法进行交互。如果这没有意义,请告诉我,我可以用一个示例更新我的答案@Capan
猜你喜欢
  • 2023-02-09
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
相关资源
最近更新 更多