解决TS2345错误:让TypeScript识别不可能路径下doc的field非undefined
export interface MyDoc{ field: string; } function insert(doc: MyDoc) { /* db insert code here */ } let x; // simulate undefined value let doc = { field: x }; console.log(JSON.stringify(doc)); if (x === undefined) { // also does not prevent with doc.field === undefined return; // return if x is undefined } insert(doc); // causes TS2345: Argument of type error
从逻辑上看,执行到insert(doc)时doc.field不可能为undefined,但TypeScript仍报TS2345错误。需在保留日志输出等场景使用undefined的前提下,告知TypeScript类型检查器此时doc的field值不可能是undefined,可通过以下几种方式解决:
方法1:类型断言强制收窄
直接在调用insert时断言doc符合MyDoc类型,简单直接,但需确保逻辑判断已彻底排除undefined的可能:
insert(doc as MyDoc);
方法2:重新赋值收窄类型
先给x声明明确的联合类型,通过判断收窄x的类型后,重新赋值给doc.field,让TypeScript自动追踪类型变化:
let x: string | undefined; // 明确x的类型范围 let doc = { field: x }; console.log(JSON.stringify(doc)); if (x === undefined) { return; } // 此时x已被收窄为string类型,重新赋值后doc.field类型同步更新 doc.field = x; insert(doc);
方法3:非空断言操作符
如果能百分百确认doc.field此时非undefined,可使用!操作符断言其非空,注意仅在逻辑绝对可靠时使用:
insert({ field: doc.field! }); // 或直接断言整个doc对象 insert(doc!);
方法4:自定义类型守卫
若需复用类型检查逻辑,可编写自定义类型守卫函数,严谨判断doc是否符合MyDoc类型:
function isMyDoc(doc: { field?: string | undefined }): doc is MyDoc { return typeof doc.field === 'string'; } // 调用前通过守卫检查 if (isMyDoc(doc)) { insert(doc); }
内容的提问来源于stack exchange,提问作者user1763370
相关产品推荐
相关产品推荐

