Typeguard验证含错误子字段对象时逻辑异常问题排查
问题分析与修复
你的验证函数返回结果不符合预期,核心问题是return语句的布尔逻辑错误,as关键字不影响运行时逻辑——它只是TypeScript的类型断言,编译成JS后会被移除,不会改变代码的执行行为。
错误原因
原代码用了||(逻辑或),只要date或criteria其中一个存在就返回true。但你的DischargeEntry接口要求两个字段必须同时存在且都是string类型,当前逻辑完全不符合需求。另外,原代码还没检查字段的类型是否为string,就算字段存在但类型不对(比如date是数字),也会错误地通过验证。
修复后的代码
interface DischargeEntry { date: string; criteria: string; } const isDischargeEntry = (discharge: unknown): discharge is DischargeEntry => { // 先判断是不是非null的对象,避免后续访问属性报错 if (typeof discharge !== 'object' || discharge === null) { return false; } // 断言为对象后,检查两个字段都存在且类型为string const entry = discharge as DischargeEntry; return typeof entry.date === 'string' && typeof entry.criteria === 'string'; }; const incorrectDischarge: unknown = { criteria: "Thumb has healed." }; console.log('isDischargeEntry:', isDischargeEntry(incorrectDischarge)) // = false(符合预期)
修复要点
- 先校验输入是否为非null的对象,排除基础类型和null的情况
- 用
&&(逻辑与)替代||,确保两个字段同时满足要求 - 检查字段的实际类型是否为
string,严格匹配接口定义
内容的提问来源于stack exchange,提问作者BoarderCauli
相关产品推荐
相关产品推荐

