Генерация типов TypeScript из данных JSON является важной задачей для разработчиков, работающих с данными API. Без соответствующих типов разработчики лишаются автозаполнения, безопасности рефакторинга и проверок ошибок во время компиляции. С другой стороны, наличие типов делает редактор мощным инструментом. Однако, вопрос о том, как правильно сгенерировать эти типы, не имеет единого ответа. Лучший подход зависит от размера JSON-пayload, частоты изменений схемы и необходимости runtime-проверки наряду со статическими типами.
Вручную
Самый простой метод генерации типов - это ручное написание интерфейсов на основе JSON-данных. Например, для следующего JSON:
{
"id": 101,
"name": "Alice Chen",
"email": "alice@example.com",
"role": "admin",
"projects": [
{
"projectId": "p-200",
"title": "Dashboard Redesign",
"status": "active",
"tags": ["ui", "frontend"]
}
],
"meta": {
"lastLogin": "2026-02-20T08:30:00Z",
"twoFactorEnabled": true
}
}
Можно написать следующие интерфейсы:
interface Project {
projectId: string;
title: string;
status: string;
tags: string[];
}
interface UserMeta {
lastLogin: string;
twoFactorEnabled: boolean;
}
interface User {
id: number;
name: string;
email: string;
role: string;
projects: Project[];
meta: UserMeta;
}
Этот метод дает полный контроль над именованием полей, необязательными полями и типами объединения. Однако, он может быть утомительным для больших или глубоко вложенных JSON-данных и подвержен ошибкам (опечатки, пропущенные поля). Кроме того, необходимо обновлять типы вручную при изменении API.
Преимущества и недостатки ручного метода
Преимущества ручного метода включают:
- Отсутствие зависимостей
- Полный контроль над именованием, необязательными полями и типами объединения
- Легкость добавления комментариев JSDoc
Недостатки ручного метода включают:
- Утомительность для больших или глубоко вложенных JSON-данных
- Подверженность ошибкам (опечатки, пропущенные поля)
- Необходимость ручного обновления при изменении API
Ручной метод является подходящим для небольших JSON-пayload с менее чем 10 полями, одноразовых скриптов или ситуаций, когда необходимо очень точное определение типов объединения и необязательных полей, которые невозможно вывести из одного образца.