TypeScript Academy · Урок

Вывод типов из схем

Выводите статические типы непосредственно из схем Zod

Урок 2 из 413 шагов

«Вывод типов из схем» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.

Schema содержит информацию о типе

Schema Zod знает тип TypeScript, который она проверяет. z.infer извлекает этот тип, поэтому структуру нужно описать один раз.

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
// User is { name: string; age: number }

Средство z.infer

z.infer<typeof schema> создаёт статический тип, который проверяет schema. Обратите внимание на typeof: передаётся значение schema.

import { z } from "zod";
const tagSchema = z.array(z.string());
type Tags = z.infer<typeof tagSchema>; // string[]

Единый источник истины

Без вывода типов Вам пришлось бы отдельно поддерживать тип и schema, и со временем они могли бы разойтись. z.infer сохраняет их полную синхронность.

import { z } from "zod";
const schema = z.object({ id: z.number(), email: z.string() });
type Account = z.infer<typeof schema>;
// Change the schema, the type updates automatically.

Вывод вложенных типов

Вывод типов обрабатывает вложенные объекты и массивы, создавая полный вложенный тип TypeScript из одной schema.

import { z } from "zod";
const postSchema = z.object({
  title: z.string(),
  author: z.object({ name: z.string() }),
  tags: z.array(z.string())
});
type Post = z.infer<typeof postSchema>;
// Post.author.name is string

Использование выведенного типа

Используйте выведенный тип везде, где применили бы написанный вручную тип: в параметрах функций, переменных и возвращаемых типах.

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
function greet(u: User): string {
  return "Hi " + u.name;
}

parse возвращает выведенный тип

schema.parse возвращает значение, уже типизированное как выведенный тип, поэтому последующий код полностью типизирован.

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
const raw: unknown = { name: "Ada", age: 36 };
const user: User = userSchema.parse(raw); // typed and validated

Необязательные и допускающие null поля в типе

Модификаторы schema передаются в выведенный тип. Поле с модификатором .optional() становится необязательным в TypeScript.

import { z } from "zod";
const schema = z.object({
  name: z.string(),
  nickname: z.string().optional()
});
type P = z.infer<typeof schema>;
// P is { name: string; nickname?: string }

Вывод типов из массивов объектов

Объедините z.array и z.object, и выведенный тип будет массивом объектов соответствующего типа.

import { z } from "zod";
const usersSchema = z.array(z.object({ id: z.number() }));
type Users = z.infer<typeof usersSchema>;
// Users is { id: number }[]

Зачем нужен typeof

Schema является значением, поэтому перед передачей в z.infer нужно обратиться к её типу с помощью typeof schema.

import { z } from "zod";
const s = z.string();
type S = z.infer<typeof s>; // string
// z.infer<s> would be wrong: s is a value, not a type.

Вывод типов на границах модулей

Экспортируйте и schema, и её выведенный тип, чтобы другие модули могли единообразно проверять данные и использовать ту же структуру.

import { z } from "zod";
export const userSchema = z.object({ name: z.string() });
export type User = z.infer<typeof userSchema>;
// Consumers import both the runtime schema and the type.

Одно определение, два мира

Schema отвечает за проверку во время выполнения, а z.infer — за типизацию во время компиляции. Одно объявление обеспечивает и то и другое, устраняя дублирование.

import { z } from "zod";
const configSchema = z.object({ port: z.number(), host: z.string() });
type Config = z.infer<typeof configSchema>;
// Validate at runtime, type at compile time, no drift.

Быстрая проверка: вывод типов

Проверьте, насколько хорошо Вы понимаете вывод типов из schema.

Повторение: вывод типов из schema

Вы узнали, что z.infer<typeof schema> выводит тип TypeScript из schema Zod, создавая единый источник истины для проверки и типов, включая вложенные, необязательные структуры и массивы.

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
// User stays in sync with the schema automatically.
Можно начать бесплатно

Изучай TypeScript с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
101
Уроки
352

Часто задаваемые вопросы

Урок «Вывод типов из схем» бесплатный?

Да — полный текст урока «Вывод типов из схем» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Вывод типов из схем»?

Выводите статические типы непосредственно из схем Zod Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Вывод типов из схем»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы схем Zod
  2. Вывод типов из схем
  3. parse и safeParse
  4. Составление и уточнение схем
← Назад к TypeScript Academy