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