创建从 TypeScript 中的错误扩展的自定义类

在 TypeScript 中创建一个扩展自 Error 的自定义类

Create custom Class that extends from Error in TypeScript

要创建一个扩展自的自定义类Error

  1. 定义一个从对象扩展的新类Error
  2. super()在类的构造函数中使用该方法。
  3. 手动调整新类的原型。
索引.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具有类型,因此我们必须在访问该属性之前使用运算符。unknowncatchinstanceofmessage

这是必需的,因为没有办法提前确定捕获的错误是特定类型的。

请注意,任何子类化的类CustomError也需要手动调整原型。

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: