Как в TypeScript вообще проверить экземпляр объектной переменной?

Я хочу проверить, имеет ли переменная объекта 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.info(isPerson); // true

Когда я выполняю этот код, он дает Person in not defined!

Я ожидаю, что код зарегистрирует true, поскольку объект является экземпляром 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);
};

Конрад сослался на эту библиотеку в комментариях ниже.

Спасибо, @Конрад!

🤔 А знаете ли вы, что...
JavaScript является одним из трех основных языков веб-разработки, вместе с HTML и CSS.


625
2

Ответы:

Решено

interface — это статическая функция TypeScript. instanceof — динамический оператор ECMAScript. interface не существуют во время выполнения, и ECMAScript ничего не знает о типах TypeScript.

Следовательно, вы не можете проверить во время выполнения, соответствует ли объект interface.

Вы можете использовать библиотеку валидаторов, например 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);
};

Конрад ссылался на эту библиотеку в комментариях выше.

Спасибо, @Конрад!


Вы можете создать функцию защиты типа, которая проверяет, соответствует ли объект типам, указанным в интерфейсе. Так: function isPerson(obj: any): obj is Person { return obj && typeof obj.name === 'string' && typeof obj.age === 'number'; } вернет true или false, если какой-либо из параметров не соответствует указанному типу. Затем вы измените свой журнал консоли на console.info(isPerson(obj));.