如何在TypeScript中使用类型守卫验证对象内部字段?
解决TypeScript类型守卫中unknown类型的验证问题
你遇到的Object is of type 'unknown'.ts(2571)错误,核心原因是类型守卫函数的参数为unknown类型,TypeScript不允许直接对unknown执行in操作符这类属性检查,必须先把类型缩小到非null的对象类型,才能继续验证字段。
下面是正确的实现方式,确保能验证Field1、Field2存在且均为字符串类型:
1. 定义接口和类型守卫函数
// 目标数据结构接口 interface PropertyType { Field1: string; Field2: string; } // 类型守卫函数:验证输入是否符合PropertyType规范 function isPropertyEntry(property: unknown): property is PropertyType { // 第一步:排除非对象、null的情况,缩小类型范围 if (typeof property !== 'object' || property === null) { return false; } // 断言为任意键值对类型,允许检查属性存在性 const obj = property as Record<string, unknown>; // 第二步:验证字段存在且类型为字符串 return ( 'Field1' in obj && typeof obj.Field1 === 'string' && 'Field2' in obj && typeof obj.Field2 === 'string' ); }
2. 解析函数中使用类型守卫
function parseProperty(rawFormData: unknown): PropertyType { if (!isPropertyEntry(rawFormData)) { throw new Error('提交的表单数据格式不符合要求'); } // 此时rawFormData已被TypeScript推断为PropertyType类型,可安全写入数据库 return rawFormData; }
关键细节说明
- 必须先通过
typeof property !== 'object' || property === null过滤非对象类型,这是TypeScript允许后续属性检查的前提。 - 使用
Record<string, unknown>断言是为了在类型缩小的基础上,合法检查对象的属性存在性,同时保留后续类型验证的空间。 - 不能只检查字段存在性,必须同时验证类型为字符串,避免出现字段存在但类型不符(比如是数字、undefined)的情况。
内容的提问来源于stack exchange,提问作者BoarderCauli
相关产品推荐
相关产品推荐

