【发布时间】:2021-08-27 23:57:38
【问题描述】:
我正在尝试了解如何正确处理 unknown 变量,该变量可能是具有某些我可以使用的属性的对象。这源于使用仍在开发中的第三方库时的各种 try/catch 场景,因此“e”可能是也可能不是具有某些属性的对象。
以下是我的问题的简化版本,但该问题还有其他表现形式。因此,我希望避免类型断言或禁用类型检查。我正在寻找的是一种检查“未知”值以查看它是否是具有某些属性的对象的正确方法。
如果条件不充分,为什么会出现以下情况? TypeScript 只是将其视为未知对象,并没有使用我传递的信息来确保 (1) 它是一个 object,(2) 它是 not null ,并且 (3) 它有键“errNum”。
在所有这些检查之后,还有哪些其他可能的情况会导致 "console.log(e.errNum)" 在运行时抛出错误?这在 VSCode GUI 和使用 webpack 5 构建时都会失败(在最近从 tslint 迁移后使用 eslint)。我想不出任何其他会在运行时导致问题的边缘情况。
try {
const err = { errNum: 12 };
throw err;
} catch (e) {
// e is inferred as unknown, as it should be
if (e && typeof e === 'object' && 'errNum' in e) console.log(e.errNum); // TS error: Property 'errNum' does not exist on type 'object'.
}
【问题讨论】:
-
尽可能避免过多的类型断言。例如,以下内容会起作用,但会变得非常冗长:
else if (e) errorMessage += `\n\n${typeof e === 'object' && (e as AnyObject)?.message ? (e as AnyObject).message : (e as AnyObject).toString()}`;
标签: typescript