解决 TypeScript 中 Property 'status' does not exist on type 'Error' 错误
出现错误“**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);
我们在上面的示例中得到错误的原因是 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
的类也需要手动调整原型。
相关文章
在 AngularJs 中设置 Select From Typescript 的默认选项值
发布时间:2023/04/14 浏览次数:78 分类:Angular
-
本教程提供了在 AngularJs 中从 TypeScript 中设置 HTML 标记选择的默认选项的解释性解决方案。
在 Angular 中使用 TypeScript 的 getElementById 替换
发布时间:2023/04/14 浏览次数:153 分类:Angular
-
本教程指南提供了有关使用 TypeScript 在 Angular 中替换 document.getElementById 的简要说明。这也提供了在 Angular 中 getElementById 的最佳方法。
在 TypeScript 中使用 try..catch..finally 处理异常
发布时间:2023/03/19 浏览次数:181 分类:TypeScript
-
本文详细介绍了如何在 TypeScript 中使用 try..catch..finally 进行异常处理,并附有示例。
在 TypeScript 中使用 declare 关键字
发布时间:2023/03/19 浏览次数:97 分类:TypeScript
-
本教程指南通过特定的实现和编码示例深入了解了 TypeScript 中 declare 关键字的用途。
在 TypeScript 中 get 和 set
发布时间:2023/03/19 浏览次数:172 分类:TypeScript
-
本篇文章演示了类的 get 和 set 属性以及如何在 TypeScript 中实现它。
在 TypeScript 中格式化日期和时间
发布时间:2023/03/19 浏览次数:161 分类:TypeScript
-
本教程介绍内置对象 Date() 并讨论在 Typescript 中获取、设置和格式化日期和时间的各种方法。
在 TypeScript 中返回一个 Promise
发布时间:2023/03/19 浏览次数:182 分类:TypeScript
-
本教程讨论如何在 TypeScript 中返回正确的 Promise。这将提供 TypeScript 中 Returns Promise 的完整编码示例,并完整演示每个步骤。
在 TypeScript 中定义函数回调的类型
发布时间:2023/03/19 浏览次数:221 分类:TypeScript
-
本教程说明了在 TypeScript 中为函数回调定义类型的解决方案。为了程序员的方便和方便,实施了不同的编码实践指南。
在 TypeScript 中把 JSON 对象转换为一个类
发布时间:2023/03/19 浏览次数:110 分类:TypeScript
-
本教程演示了如何将 JSON 对象转换为 TypeScript 中的类。