Zod — это мощная библиотека TypeScript для проверки и проверки типов во время выполнения. Одной из его ключевых особенностей является возможность определять типы объединений с помощью конструктора ZodUnion. Однако вы можете столкнуться с сообщением об ошибке типа «Свойство «extends» не существует для типа «ZodUnion». Цель этой статьи — пролить свет на эту проблему и предоставить вам различные методы и примеры кода для ее решения.
Расшифровка ошибки.
Сообщение об ошибке «Свойство «extends» не существует для типа «ZodUnion»» обычно появляется при попытке использовать ключевое слово extendsдля ZodUnionэкземпляр. Ключевое слово extendsне поддерживается напрямую в ZodUnion, поскольку оно представляет собой объединение нескольких потенциальных типов, и его расширение в традиционном смысле не имеет семантического смысла.
Методы работы с ZodUnion:
- Использование метода
super():
Хотя вы не можете напрямую расширитьZodUnion, вы можете использоватьsuper()метод для доступа к базовым типам внутри объединения. Вот пример:
import { z, ZodUnion } from "zod";
const userSchema = z.object({
name: z.string(),
age: z.number(),
});
const optionalUserSchema = userSchema.optional();
function validateUser(user: ZodUnion<typeof userSchema | typeof optionalUserSchema>) {
if (user._def.typeName === "union") {
// Accessing the underlying types
const [typeA, typeB] = user._def.options;
// Perform specific validations based on typeA and typeB
} else {
// Perform validations for individual type
}
}
- Использование средств защиты типов.
Защитники типов позволяют сузить типы внутри объединения для выполнения определенных операций на основе фактического типа. Вот пример:
function processUser(user: ZodUnion<typeof userSchema | typeof optionalUserSchema>) {
if ("name" in user) {
// User is of type `typeof userSchema`
console.log(user.name);
} else {
// User is of type `typeof optionalUserSchema`
console.log("User is optional");
}
}
- Использование дискриминантных свойств.
Вы можете использовать дискриминантные свойства, чтобы различать потенциальные типы внутри объединения. Вот пример:
const personSchema = z.object({
type: z.literal("person"),
name: z.string(),
age: z.number(),
});
const organizationSchema = z.object({
type: z.literal("organization"),
name: z.string(),
address: z.string(),
});
const entitySchema = z.union([personSchema, organizationSchema]);
function processEntity(entity: typeof entitySchema) {
if (entity.type === "person") {
// Perform operations for a person
} else if (entity.type === "organization") {
// Perform operations for an organization
}
}
Работа с ZodUnionв Zod требует другого подхода по сравнению с традиционным наследованием классов. Используя такие методы, как super(), средства защиты типов и дискриминантные свойства, вы можете эффективно обрабатывать типы объединений и выполнять операции, специфичные для типов. Понимание этих методов поможет вам преодолеть сообщение об ошибке «Свойство «extends» не существует для типа «ZodUnion»» и использовать весь потенциал возможностей проверки типов Zod.
Не забудьте обратиться к документации Zod для получения более подробной информации и изучения множества предлагаемых функций.