TypeScript中检查对象是否符合接口及instanceof报错解决
问题描述
用户编写了如下代码,试图检查obj对象是否具备Person接口的所有属性:
interface Person { name: string; age: number; } const jsonObj = `{ name: "John Doe", age: 30, }`; const obj: Person = JSON.parse(jsonObj); const isPerson = obj instanceof Person; // Person is not defined console.log(isPerson); // true
执行代码时触发Person is not defined错误,但用户预期输出true,认为obj符合Person接口定义。
问题根源
TypeScript的类型系统仅作用于编译阶段,而instanceof是JavaScript的运行时操作。TypeScript接口在编译为JavaScript后会被完全剔除,运行环境中不存在Person构造函数,因此无法通过instanceof校验对象是否符合接口要求。
可行方案:使用zod库实现运行时校验
可以借助zod这类运行时校验库,先通过Schema定义对象的结构约束,再自动推断出对应的TypeScript类型,最终完成对象的合法性校验。示例代码如下:
import { z } from 'zod'; // 定义Person对象的校验规则 export const PersonSchema = z.object({ name: z.string(), age: z.number(), }); // 从校验规则自动推断TypeScript类型 export type Person = z.infer<typeof PersonSchema>; // 校验函数:返回对象是否符合Person类型 const isPerson = (obj: unknown): obj is Person => { const validationResult = PersonSchema.safeParse(obj); return validationResult.success; }; // 修正原代码的JSON格式错误(JSON键必须用双引号) const jsonObj = `{"name": "John Doe", "age": 30}`; const obj = JSON.parse(jsonObj); console.log(isPerson(obj)); // 输出true
注:原代码中的jsonObj字符串不符合JSON语法规范(键未用双引号包裹),会导致JSON.parse执行失败,上述示例已修正该问题。
内容的提问来源于stack exchange,提问作者Monero Jeanniton
相关产品推荐
相关产品推荐

