TypeScript报错TS2571: Object is of type 'unknown'如何解决
报错根因
TS2571 触发的核心原因是 TypeScript 4.0 及以上版本中,catch 块捕获的异常值默认类型为 unknown,TS 不允许直接访问 unknown 类型值的属性。
除此之外你的代码还有两个显性问题:
catch关键字后没有声明接收异常的参数,块内直接使用error不符合基础语法console.log(error)写在catch块外部,超出error变量的作用域,同样会触发编译错误
修复方案
优先使用类型守卫做运行时校验,在确认异常结构符合预期后再访问属性,既解决编译报错,也避免运行时出现属性不存在的异常,修复后可直接运行的代码如下:
try { // 此处填写你的业务逻辑代码 } catch (error) { // 给错误信息设置默认值,避免非预期错误场景下返回undefined let errMsg = "服务器内部错误"; // 类型守卫:校验error结构是否符合MongoDB唯一键重复错误的特征 if ( typeof error === "object" && error !== null && "code" in error && "keyValue" in error && (error as { code: unknown }).code === 11000 ) { const duplicateKeyErr = error as { code: 11000; keyValue: Record<string, unknown>; }; errMsg = `${Object.keys(duplicateKeyErr.keyValue)[0]}已存在`; } console.log(error); return res.status(500).json({ msg: errMsg }); }
如果项目不需要对catch块的异常做严格类型校验,也可以修改tsconfig.json配置,将catch块异常默认类型改回any:
{ "compilerOptions": { "useUnknownInCatchVariables": false } }
注意:不推荐直接在catch参数后写catch(error: any)绕过校验,这种写法会丢失类型检查能力,容易引发运行时异常。
内容的提问来源于stack exchange,提问作者hamdi ben abdelhafidh
相关产品推荐
相关产品推荐

