You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 11:42:46