TypeScript赋值时出现“Object is possibly undefined”错误求解
为何赋值
cached.promise会触发「Object is possibly undefined」错误? 原因解析
TypeScript的类型检查逻辑是:先检查你要访问的对象是否存在,再处理后续的赋值/取值操作。当你写cached.promise = ...时,第一步是要读取cached这个对象,再访问它的promise属性。如果TypeScript推断出cached可能为undefined,哪怕你是要给属性赋值,它也会先在访问对象这一步抛出错误——毕竟如果cached真的是undefined,undefined.promise本身就是非法操作,赋值也无法解决这个问题。
可行的解决方式
你用类型断言的方法是有效的,直接告诉TypeScript你确定cached是一个包含promise属性的对象:
(cached as { promise: Promise<typeof mongoose> }).promise = mongoose .connect(MONGODB_URI as string, opts) .then(mongoose => mongoose);
除此之外还有两种更稳妥的常见方案:
- 先判断对象存在性
通过条件判断确保cached不是undefined后再赋值,这也是TypeScript推荐的安全写法:
if (cached) { cached.promise = mongoose.connect(MONGODB_URI as string, opts).then(m => m); }
- 给
cached明确类型定义
如果cached是你自己声明的变量,可以直接给它指定非可选的类型,从根源上消除“可能为undefined”的推断:
// 声明时就明确cached是包含promise属性的对象 const cached: { promise: Promise<typeof mongoose> } = { promise: mongoose.connect(MONGODB_URI as string, opts).then(m => m) }; // 或者如果promise初始值可以为空,用可选属性+后续赋值 const cached: { promise?: Promise<typeof mongoose> } = {}; if (cached) { cached.promise = mongoose.connect(MONGODB_URI as string, opts).then(m => m); }
补充说明
不用因为评论区的纠正感到懊恼——TypeScript的严格检查有时候确实会和直觉冲突,尤其是刚接触类型系统的时候,习惯后就会明白它是在帮你提前规避潜在的运行时错误。
内容的提问来源于stack exchange,提问作者Anthony Bias
相关产品推荐
相关产品推荐

