"Error"类型上不存在属性'code'。

31

如何访问Error.code属性?我收到了一个TypeScript错误,因为类型“Error”上不存在“code”属性。

this.authCtrl.login(user, {
   provider: AuthProviders.Password,
   method: AuthMethods.Password
}).then((authData) => {
    //Success
}).catch((error) => {
   console.log(error); // I see a code property
   console.log(error.code); //error
})
4个回答

58

真正的问题在于Node.js的定义文件没有导出一个合适的错误(Error)定义。它对于Error使用以下内容(并未导出此内容):

interface Error {
    stack?: string;
}

它所导出的实际定义位于NodeJS名称空间中:

export interface ErrnoException extends Error {
    errno?: number;
    code?: string;
    path?: string;
    syscall?: string;
    stack?: string;
}

所以以下的类型转换将有效:

.catch((error: NodeJS.ErrnoException) => {
    console.log(error);
    console.log(error.code);
})

这似乎是Node定义上的缺陷,因为它与从new Error()创建的对象实际包含的内容不符。TypeScript将强制执行Error接口的定义。


8
不是完整的解决方案。完整的解决方案还应该显示需要添加的导入语句,以便“拥有” NodeJS 符号。 - Szczepan Hołyszewski
2
@SzczepanHołyszewski,这个答案对我非常有用,不需要额外的import - bmaupin

5

你需要从catch中将类型转换为错误参数,例如:

.catch((error:any) => {
    console.log(error);
    console.log(error.code);
});

或者您可以直接通过以下方式访问代码属性
.catch((error) => {
    console.log(error);
    console.log(error['code']);
});

2

根据 @Brent 在 https://dev59.com/YFkS5IYBdhLWcg3wRUgU#49562477 中的解释,这个问题是由 Typescript 包中未完成的类型定义引起的(请参考 https://github.com/microsoft/TypeScript/blob/ed6889cd5b61b9fa5156018362d867def18e281d/lib/lib.es5.d.ts#L1039-L1043)。使用 ECMAScript 2015 版本或更高版本的用户也可以使用模块声明来声明缺少的属性。这可以通过将下面的代码放置在@types/global.d.ts文件中来实现。

declare interface Error {
  name: string
  message: string
  stack?: string
  code?: number | string
}

-1
export default class ResponseError extends Error {
    code: number;
    message: string;
    response: {
        headers: { [key: string]: string; };
        body: string;
    };
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接