我希望能够拥有一个类ChildError
,默认情况下对其属性有一些基本定义:code
和message
。
但是,当我实际抛出此错误时,我可能会重新定义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
在已编译的javascript中,看起来这不起作用,因为传递的参数在我们分配默认值code
和message
之前处理,因此它们会被覆盖。怎么避免呢?我希望在默认值之后处理参数!
此外,构造函数中的console.log
会按照我们想要的this.message
打印hello
,当我们尝试使用getMessage()
访问This is the child error message
时它返回{{1}}。
我已阅读此SO thread,但它似乎无法应用,因为该属性与我的类名不同...
答案 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)