TypeScript4.3.5报“类型unknown无法分配给boolean类型”如何解决?
问题原因
TypeScript 4.0及以上版本默认启用useUnknownInCatchVariables编译选项,catch子句捕获的error变量默认类型为unknown,禁止直接赋值给其他明确类型的变量,因此你将error直接赋值给queueEntry.error(类型为boolean)时会触发类型报错。
可选解决方案
- 方案1:类型断言
如果你明确当前场景下error的类型符合要求,可直接通过as做类型断言:
catch (error) { queueEntry.error = error as boolean; this.inProcess = this.inProcess.filter(queueTmp => queueTmp.id !== queueEntry.id).concat([]); this.failed.push(queueEntry); console.log(error); }
如果是queueEntry的error字段类型定义有误(比如本来要存错误对象误写为boolean),可先修改类型定义,将error字段设置为Error | undefined或unknown类型即可直接赋值。
- 方案2:类型收窄处理(更安全)
先对error做类型校验,符合要求再赋值,避免类型安全问题:
catch (error) { if (typeof error === 'boolean') { queueEntry.error = error; } else { // 自定义非布尔类型的兜底逻辑,比如标记为有错误 queueEntry.error = true; } this.inProcess = this.inProcess.filter(queueTmp => queueTmp.id !== queueEntry.id).concat([]); this.failed.push(queueEntry); console.log(error); }
- 方案3:关闭catch变量类型检查(不推荐)
在tsconfig.json的compilerOptions中添加如下配置,关闭该严格检查项:
{ "useUnknownInCatchVariables": false }
关闭后catch的error变量默认类型为any,可直接赋值,但会丢失类型安全校验能力,不建议在生产项目中使用。
内容的提问来源于stack exchange,提问作者Amine Aamer
相关产品推荐
相关产品推荐

