TypeScript中如何校验对象是否包含其类型的全部属性?
在TypeScript中检查对象是否包含类型全部属性的方案
TypeScript的静态类型系统仅在编译阶段生效,编译完成后所有类型信息会被擦除,因此无法直接通过TypeScript本身在运行时检查对象是否包含对应类型的全部属性。但我们可以通过手动编写运行时校验逻辑来实现需求。
具体实现步骤
定义类型接口,并维护一份该类型的必填字段列表
interface Person { name: string; age: number; eyeColor: string; } // 用keyof约束字段列表,确保和接口定义一致 const PERSON_REQUIRED_FIELDS: Array<keyof Person> = ['name', 'age', 'eyeColor'];编写校验函数,遍历字段列表检查对象属性
function validatePerson(obj: unknown): asserts obj is Person { if (typeof obj !== 'object' || obj === null) { throw new Error('输入不是有效的对象'); } for (const field of PERSON_REQUIRED_FIELDS) { if (!(field in obj)) { throw new Error(`${String(field)}字段缺失`); } // 可选:额外校验字段类型是否符合要求 const value = (obj as Person)[field]; switch (field) { case 'name': case 'eyeColor': if (typeof value !== 'string') { throw new Error(`${String(field)}必须是字符串类型`); } break; case 'age': if (typeof value !== 'number' || !Number.isInteger(value)) { throw new Error(`${String(field)}必须是整数类型`); } break; } } }测试校验逻辑
// 测试缺失age的对象 const incompletePerson = { name: "Joe", eyeColor: "brown", }; try { validatePerson(incompletePerson); console.log('对象校验通过'); } catch (err) { console.error(err.message); // 输出:age字段缺失 }
补充说明
- 用
keyof Person约束字段列表,能避免手动写错字段名,确保和接口定义同步 asserts obj is Person是TypeScript的类型断言函数,校验通过后,后续代码会自动将obj推断为Person类型- 如果需要处理嵌套对象、复杂规则校验,可考虑Zod、Yup等第三方校验库;简单场景下手动编写逻辑更轻量
内容的提问来源于stack exchange,提问作者adamn11
相关产品推荐
相关产品推荐

