You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript转TypeScript:错误处理逻辑迁移遇问题求指导

Node.js下JavaScript错误处理迁移到TypeScript的解决方案

在TypeScript中,catch捕获的错误默认类型是unknown,这是TS的安全设计——因为抛出的错误不一定是Error实例。同时,原生Error类型并没有status属性,所以直接赋值会触发类型错误。下面是几种可行的解决方式:

方案一:自定义HTTP错误类(推荐)

创建继承自Error的自定义错误类,显式添加status属性,这是最规范、类型最安全的做法:

class HttpError extends Error {
  status: number;

  constructor(message: string, status: number) {
    super(message);
    this.status = status;
    // 修复原型链,确保instanceof判断正常工作
    Object.setPrototypeOf(this, HttpError.prototype);
  }
}

// 业务代码中的错误处理
try {
  // 执行业务逻辑,比如调用数据库、第三方接口等
  // 如果需要主动抛错,直接使用自定义类:
  // throw new HttpError('数据库查询失败', 500);
} catch (err) {
  if (err instanceof HttpError) {
    // 直接处理带status的自定义错误
    throw err;
  } else if (err instanceof Error) {
    // 将原生Error包装为自定义HttpError
    const wrappedErr = new HttpError(err.message, 500);
    throw wrappedErr;
  } else {
    // 处理非Error类型的错误(比如抛出的是字符串、数字)
    const unknownErr = new HttpError('未知错误', 500);
    throw unknownErr;
  }
}

方案二:全局扩展Error接口

如果不想创建新的错误类,可以通过全局声明扩展Error的类型,让TS识别status属性:

// 在项目的类型声明文件(比如global.d.ts)中添加:
declare global {
  interface Error {
    status?: number;
  }
}

// 业务代码中的错误处理
try {
  // 业务逻辑代码
} catch (err) {
  if (err instanceof Error) {
    err.status = 500; // 现在TS不会报错
    throw err;
  } else {
    // 非Error类型转为带status的Error
    const error = new Error(String(err));
    error.status = 500;
    throw error;
  }
}

方案三:类型断言(快速临时方案)

如果只是临时解决问题,可以用类型断言绕过TS的类型检查,但这种方式安全性较低,不推荐在生产代码中大量使用:

try {
  // 业务逻辑代码
} catch (err) {
  if (err instanceof Error) {
    // 断言err为带有status属性的对象
    (err as { status?: number }).status = 500;
    throw err;
  } else {
    console.log('非Error类型错误:', err);
    // 或者抛出一个标准的带status的错误对象
    throw { message: String(err), status: 500 };
  }
}

注意事项

  • 始终先对err做类型收窄(比如instanceof Error),避免直接操作unknown类型的属性;
  • 如果是第三方库抛出的错误,需要先确认错误的结构,再选择对应的处理方式;
  • 自定义错误类时,务必修复原型链,否则instanceof判断会失效。

内容的提问来源于stack exchange,提问作者Pawan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:15:36