在TypeScript中,一般如何检查对象变量的instanceof? [重复]

问题描述 投票:0回答:2

我想检查 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 in not defined

我希望代码记录为 true,因为 obj 是 Person 的实例。

  -----




答案更新:使用 zod 库的替代工作解决方案

TypeScript 仅在编译时工作,但instanceof 是运行时的事情。您不能在类型上使用,因为 javascript 中不存在类型。

您可以使用像zod这样的验证器库。然后,您可以推断对象的(“TypeScript”)类型并使用 zod 进行验证。

举例来说,

import { z } from 'zod';

export const ItemSchema = z.object({
  name: z.string(),
  description: z.string(),
  productServiceId: z.number().optional(),
});

export type Item = z.infer<typeof ItemSchema>;

const validateItems = (items: Item[]) => {
    const ItemSchemaArray = z.array(ItemSchema);
    // This line below will throw an error if the validation failed
    ItemSchemaArray.parse(items);
};

Konrad 在下面的评论中引用了这个库。

谢谢你,@Konrad!

javascript typescript types properties instanceof
2个回答
0
投票

interface
是静态 TypeScript 功能。
instanceof
是一个动态 ECMAScript 运算符。
interface
在运行时不存在,ECMAScript 对 TypeScript 类型一无所知。

因此,您无法在运行时测试对象是否符合

interface


0
投票

您可以创建一个类型保护函数来检查对象是否遵循界面中设置的类型。所以:

function isPerson(obj: any): obj is Person { return obj && typeof obj.name === 'string' && typeof obj.age === 'number'; }
如果任一参数不是指定的类型,则返回 true 或 false。 然后,您将控制台日志更改为
console.log(isPerson(obj));

© www.soinside.com 2019 - 2024. All rights reserved.