迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > TypeScript >

解决 TypeScript 中 Property 'status' does not exist on type 'Error' 错误

作者:迹忆客 最近更新:2023/01/31 浏览次数:

出现错误“**Property 'status' does not exist on type 'Error'**”是因为 status 属性在 Error 接口上不可用。

要解决错误,需要将特定属性添加到 Error 接口或创建一个从 Error 扩展的自定义类。

下面是一个产生上述错误的示例

const err = new Error('Something went wrong');

// ⛔️ Property 'status' does not exist on type 'Error'.ts(2339)
err.status = 500;

// ⛔️ Property 'code' does not exist on type 'Error'.ts(2339)
console.log(err.code);

TypeScript 中 Property 'status' does not exist on type 'Error' 错误

我们在上面的示例中得到错误的原因是 Error 接口上不存在状态和代码属性。

默认情况下,Error 接口具有以下属性:

interface Error {
    name: string;
    message: string;
    stack?: string;
}

为了解决这个问题,我们可以将属性添加到 Error 接口。

interface Error {
  status?: number;
  code?: number;
}

const err = new Error('Something went wrong');

err.status = 500;
console.log(err.status); // 👉️ 500

err.code = 500;
console.log(err.code); // 👉️ 500

TypeScript 会将我们声明的 Error 接口与原始 Error 接口合并,因此当我们使用 Error 对象时,我们将能够从这两个接口访问方法和属性。

另一种解决方案是创建一个从 Error 扩展的自定义类。

export class CustomError extends Error {
  status = 400;

  constructor(status: number, message: string) {
    super(message);

    this.status = status;

    // 👇️ because we are extending a built-in class
    Object.setPrototypeOf(this, CustomError.prototype);
  }

  getErrorMessage() {
    return 'Something went wrong: ' + this.message;
  }
}

const err = new CustomError(500, 'Something went wrong');

console.log(err.status); // 👉️ 500
console.log(err.message); // 👉️ "Something went wrong"

我们创建了一个从 Error 扩展的 CustomError 类。

每当你扩展一个类时,你必须先调用 super() 才能使用 this 关键字。我们还必须使用 Object.setPrototypeOf 方法,因为我们正在扩展一个内置类。你必须在调用 super() 之后立即调用 Object.setPrototypeOf

我们必须对任何扩展内置函数的类和 CustomError 的任何子类使用这种方法。

基本上,我们必须手动调整原型。

如果需要检查变量是否存储 CustomError 的实例,则必须使用 instanceof 运算符。

export class CustomError extends Error {
  status = 400;

  constructor(status: number, message: string) {
    super(message);

    this.status = status;

    // 👇️ because we are extending a built-in class
    Object.setPrototypeOf(this, CustomError.prototype);
  }

  getErrorMessage() {
    return 'Something went wrong: ' + this.message;
  }
}

const err = new CustomError(500, 'Something went wrong');

// 👇️ Check if instance of CustomError
if (err instanceof CustomError) {
  console.log(err.status); // 👉️ 500
  console.log(err.message); // 👉️ "Something went wrong"
}

instanceof 运算符用作类型保护。

如果我们在代码的其他地方抛出 CustomError,则需要一种方法来检查捕获的错误是否是 CustomError,然后才能访问 CustomError 特定的属性和方法。

这与检查错误是否是 catch 块中 Error 对象的实例的方式相同。

async function getData() {
  try {
    await Promise.resolve('hello world');
  } catch (err) {
    //  👉️ err is unknown here
    // can't access Error specific properties
    if (err instanceof Error) {
      console.log(err.message); // 👈️ err is type Error here
    }

    console.log('Unexpected error: ', err);
  }
}

err 变量在 catch 块中有一个未知类型,所以我们必须先使用 instanceof 运算符才能访问 message 属性。

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

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

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 TypeScript 中返回一个 Promise

发布时间:2023/03/19 浏览次数:182 分类:TypeScript

本教程讨论如何在 TypeScript 中返回正确的 Promise。这将提供 TypeScript 中 Returns Promise 的完整编码示例,并完整演示每个步骤。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便