如何拥有基本属性并重新定义它们?

时间:2017-08-15 19:12:35

标签: javascript typescript

我希望能够拥有一个类ChildError,默认情况下对其属性有一些基本定义:codemessage

但是,当我实际抛出此错误时,我可能会重新定义message的值。如果是这种情况,我想使用新定义,而不是ChildError定义的定义。

以下是一个例子:

class BaseError extends Error {

    public code: number = 0;

    constructor(arg: any = {}) {
        super(typeof arg === 'string' ? arg : arg.message);

        this.message = arg.message;
        this.code = arg.code; 
    }

    getMessage = (): string => {
        return this.message;
    }
}

class ChildError extends BaseError {
    code = 2;
    message = 'This is the child error message';
}

const cError = new ChildError({ message: 'hello' });
console.log('print : ', cError.getMessage());

打印This is the child error message 但是,我希望打印hello

这是Playground link

在已编译的javascript中,看起来这不起作用,因为传递的参数在我们分配默认值codemessage之前处理,因此它们会被覆盖。怎么避免呢?我希望在默认值之后处理参数!

此外,构造函数中的console.log会按照我们想要的this.message打印hello,当我们尝试使用getMessage()访问This is the child error message时它返回{{1}}。

我已阅读此SO thread,但它似乎无法应用,因为该属性与我的类名不同...

2 个答案:

答案 0 :(得分:0)

只需在ChildError中声明一个构造函数,该构造函数接收带有消息的对象,默认为message,如下所示:

class BaseError extends Error {

    constructor(arg: any = {}) {
        super(typeof arg === 'string' ? arg : arg.message);

        this.message = arg.message;
    }

    getMessage = (): string => {
        return this.message;
    }
}

class ChildError extends BaseError {
  code = 2;

  constructor(arg) {
      super(arg || { message: 'This is the child error message' })
  }
}

const cError = new ChildError({ message: 'hello' });
console.log('print : ', cError.getMessage());

答案 1 :(得分:0)

您需要检查邮件属性是否存在,请尝试这种方式

class ChildError extends BaseError {
    constructor(arg: any) {
        if (!arg.hasOwnProperty('message'))
            arg.message = "This is the child error message";
        super(arg);            
    }
}

如果您打算不允许使用假值而不是

if (!arg.hasOwnProperty('message'))

简单地使用

if (!arg.message)