在 TypeScript 中创建一个扩展自 Error 的自定义类
Create custom Class that extends from Error in TypeScript
要创建一个扩展自的自定义类Error
:
- 定义一个从对象扩展的新类
Error
。 super()
在类的构造函数中使用该方法。- 手动调整新类的原型。
索引.ts
export class CustomError extends Error { statusCode = 400; constructor(message: string) { super(message); // 👇️ because we are extending a built-in class Object.setPrototypeOf(this, CustomError.prototype); } getErrorMessage() { return 'Something went wrong: ' + this.message; } } const err = new CustomError('Failed to fetch'); // 👇️ "Failed to fetch" console.log(err.message); console.log(err.statusCode); // 👉️ 400 // 👇️ "Something went wrong: Failed to fetch" console.log(err.getErrorMessage()); // ✅ Use type guard to be able to access properties/methods if (err instanceof CustomError) { console.log(err.statusCode); // 👉️ 400 // 👇️ "Something went wrong: Failed to fetch" console.log(err.getErrorMessage()); }
我们创建了一个CustomError
扩展类的类Error
。
每当你扩展一个类时,你必须super()
先调用才能使用this
关键字。
我们还必须使用该Object.setPrototypeOf
方法,因为我们正在
扩展一个内置类。
你必须Object.setPrototypeOf
在呼叫后立即呼叫super()
。
您必须将这种方法用于任何扩展内置插件的类以及
CustomError
.我们基本上是手动调整原型。如果您想详细了解为什么需要这样做,请查看
TypeScript 维基的这一部分。
确保super()
在构造函数中调用该方法,否则,您将得到
Constructors for derived classes must contain super call
错误。
检查变量是否是的实例CustomError
如果你需要检查一个变量是否存储了一个实例,你必须使用
instanceofCustomError
运算符。
索引.ts
export class CustomError extends Error { statusCode = 400; constructor(message: string) { super(message); // 👇️ because we are extending a built-in class Object.setPrototypeOf(this, CustomError.prototype); } getErrorMessage() { return 'Something went wrong: ' + this.message; } } const err = new CustomError('Failed to fetch'); // ✅ Check if instance of CustomError if (err instanceof CustomError) { console.log(err.statusCode); console.log(err.getErrorMessage()); }
运算instanceof
符充当
类型保护。
CustomError
如果您在代码的其他地方抛出 a ,则需要一种方法来检查捕获的错误是否是 a CustomError
,然后才能访问CustomError
特定的属性和方法。
Error
这与检查错误是否是块中对象的实例的方式相同
catch
。
索引.ts
async function getData() { try { await Promise.resolve(24); } catch (err) { // 👉️ err is unknown here // can't access Error specific properties if (err instanceof Error) { console.log(err.message); // 👈️ err is now Error } console.log('Unexpected error: ', err); } }
该变量在块中err
具有类型,因此我们必须在访问该属性之前使用运算符。unknown
catch
instanceof
message
这是必需的,因为没有办法提前确定捕获的错误是特定类型的。
请注意,任何子类化的类CustomError
也需要手动调整原型。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: