如何在运行时验证反序列化的JSON对象符合指定接口?
运行时验证JSON对象是否符合ResponseRecord接口
TypeScript的接口仅存在于编译阶段,编译后会被完全擦除,无法直接用于运行时的类型校验。要验证API返回的JSON对象是否符合ResponseRecord的结构,需要手动编写运行时验证逻辑。
基础验证实现
可以编写一个类型守卫函数,既完成运行时校验,又能让TypeScript在编译阶段识别类型:
interface ResponseRecord { foo: string; bar: number; } function isResponseRecord(obj: unknown): obj is ResponseRecord { // 先排除非对象/空值的情况 if (typeof obj !== 'object' || obj === null) { return false; } // 类型缩小后检查目标属性的存在性与类型 const record = obj as Record<string, unknown>; return ( typeof record.foo === 'string' && typeof record.bar === 'number' ); }
使用方式
在获取API响应后调用该函数,通过条件判断自动缩小类型范围:
const json = await response.json(); if (isResponseRecord(json)) { // 此处json会被TypeScript推断为ResponseRecord类型,可安全访问foo和bar console.log(json.foo, json.bar); } else { // 处理格式不符的情况,比如抛出错误、返回默认值等 throw new Error('API响应格式不符合预期'); }
进阶场景说明
如果需要验证更复杂的结构(比如嵌套对象、可选属性、数组元素类型等),可以基于上述逻辑扩展验证规则;也可以使用zod、io-ts这类专门的运行时类型校验库来简化代码,不过对于简单结构,手动编写验证逻辑足够轻量高效。
内容的提问来源于stack exchange,提问作者sak
相关产品推荐
相关产品推荐

