Перейти к содержанию

Автоматическая генерация TypeScript типов

Система автоматической генерации TypeScript типов из Go структур для проекта Saga.

Архитектура

backend/shared/models/*.go
   backend/cmd/typegen/
frontend/shared/types/generated-types.ts
   frontend/shared/types/unified-types.ts
   frontend/{user-app,admin-app}/

Компоненты системы

  1. Go Type Generator (backend/cmd/typegen/main.go)
  2. Анализирует Go структуры через reflection и AST
  3. Конвертирует Go типы в TypeScript интерфейсы
  4. Генерирует файл generated-types.ts

  5. Unified Types (frontend/shared/types/unified-types.ts)

  6. Экспортирует сгенерированные типы
  7. Добавляет frontend-специфичные типы
  8. Обеспечивает обратную совместимость

  9. Build Integration

  10. Автоматическая проверка при make build-container и make build
  11. Make команды для ручного управления
  12. Скрипты для мониторинга изменений

Использование

Автоматическая генерация

Типы автоматически проверяются и обновляются при:

# Запуск полной системы (рекомендуемый способ)
make build-container  # Включает генерацию типов, собирает и запускает единый контейнер

# Альтернативно для отдельных компонентов через Makefile:
make build     # Сборка всех компонентов

Ручная генерация

# Генерация типов из Go структур
make generate-types

# Проверка совместимости с frontend
make types-check

# Мониторинг изменений в Go файлах
make types-watch

# Обновление через скрипт
./scripts/update-types.sh
./scripts/update-types.sh --force      # Принудительная генерация
./scripts/update-types.sh --show-diff  # Показать изменения

Интеграция в разработку

// Проверка типов через Node.js скрипт
node frontend/shared/scripts/check-types.js
node frontend/shared/scripts/check-types.js --force   # Принудительная генерация
node frontend/shared/scripts/check-types.js --quiet   # Тихий режим (только exit code)

Конфигурация типов

Маппинг Go → TypeScript

Go тип TypeScript тип Примечание
string string
bool boolean
int, int64, float64 number
time.Time string ISO 8601 формат
decimal.Decimal string Денежные суммы как строки
[]Type Type[] Массивы
map[string]Type Record<string, Type> Объекты
*Type Type? Опциональные поля
interface{} any
JSONB Record<string, any> PostgreSQL JSONB

Специальная обработка

  • Денежные поля: decimal.Decimalstring для точности вычислений
  • Временные метки: time.Timestring в формате ISO 8601
  • Опциональные поля: указатели и поля с omitempty становятся опциональными
  • JSON теги: используются для именования полей в TypeScript

Структура файлов

frontend/shared/types/generated-types.ts

// ===================================================================
// АВТОМАТИЧЕСКИ СГЕНЕРИРОВАННЫЕ TYPESCRIPT ТИПЫ
// Источник: backend/shared/models Go структуры
// 
// ⚠️  НЕ РЕДАКТИРУЙТЕ ЭТОТ ФАЙЛ ВРУЧНУЮ!
// ===================================================================

export interface UnifiedInvestment {
  id: string;
  userID: string;
  amount: string;          // decimal.Decimal как строка
  currentValue: string;    // decimal.Decimal как строка
  status: string;
  createdAt: string;       // time.Time как ISO строка
  updatedAt: string;
  strategyID?: string;     // опциональное поле
  metadata?: Record<string, any>;  // JSONB поле
}

// ... остальные интерфейсы

frontend/shared/types/unified-types.ts

// Экспортируем все автоматически сгенерированные типы
export * from './generated-types';

// Дополнительные frontend-специфичные типы
export interface FrontendUser {
  // ... frontend-только поля
  displayName?: string;
  avatar?: string;
}

// Типы для UI компонентов
export interface TableColumn {
  // ...
}

// Совместимость с существующими типами
export type { 
  UnifiedInvestment as Investment,
  UnifiedInvestmentWithUser as InvestmentWithUser,
} from './generated-types';

Рабочий процесс

Изменение Go моделей

  1. Модифицируйте структуры в backend/shared/models/
  2. Типы автоматически обновятся при следующем make build или при сборке контейнера
  3. Или запустите make generate-types вручную

Добавление нового типа

  1. Создайте Go структуру в backend/shared/models/
  2. Добавьте анализ в backend/cmd/typegen/main.go если нужно
  3. Запустите генерацию типов
  4. Используйте новый тип в frontend через unified-types.ts

Проверка изменений

# Посмотреть какие типы изменились
git diff frontend/shared/types/generated-types.ts

# Проверить совместимость с приложениями
make types-check

# Статистика генерации
./scripts/update-types.sh --show-diff

Интеграция с CI/CD

GitHub Actions

- name: Generate and check TypeScript types
  run: |
    make generate-types
    make types-check

    # Проверить что нет несинхронизированных изменений
    git diff --exit-code frontend/shared/types/generated-types.ts

Pre-commit хуки

# Добавить в .git/hooks/pre-commit
make generate-types
git add frontend/shared/types/generated-types.ts

Troubleshooting

Типы не обновляются

# Принудительная генерация
make generate-types

# Проверка статуса файлов
ls -la frontend/shared/types/generated-types.ts
ls -la backend/shared/models/*.go

Ошибки компиляции TypeScript

# Проверка синтаксиса сгенерированных типов
make types-check

# Детальная диагностика
node frontend/shared/scripts/check-types.js

Конфликты типов

# Сравнение с предыдущей версией
git show HEAD:frontend/shared/types/generated-types.ts > /tmp/old-types.ts
diff /tmp/old-types.ts frontend/shared/types/generated-types.ts

Расширение системы

Добавление нового генератора

  1. Расширьте analyzeGoStructs() в main.go
  2. Добавьте специальную обработку в goTypeToTypeScript()
  3. Обновите документацию по маппингу типов

Кастомизация вывода

// В backend/cmd/typegen/main.go
func (g *TypeGenerator) generateTypeScript() (string, error) {
    // Добавьте свою логику генерации
}

Интеграция с другими инструментами

  • OpenAPI: генерация из TypeScript типов
  • GraphQL: создание схем из типов
  • Validation: использование типов для runtime валидации

Метрики и мониторинг

Статистика генерации

make generate-types
# Выводит:
# ✅ TypeScript типы успешно сгенерированы
# 📊 Создано типов: 118

Мониторинг изменений

# Автоматический мониторинг (требует fswatch)
make types-watch

# Периодическая проверка
watch -n 60 'make generate-types'

Качество типов

  • Покрытие: все Go структуры в shared/models покрыты
  • Точность: 1:1 соответствие между Go и TypeScript
  • Актуальность: автоматическое обновление при изменениях

Лучшие практики

Разработка Go моделей

  1. Используйте JSON теги для корректного именования полей
  2. Добавляйте комментарии к структурам для документации
  3. Группируйте связанные типы в одном файле
  4. Используйте понятные имена для полей и структур

Frontend разработка

  1. Импортируйте из unified-types.ts а не напрямую из generated-types.ts
  2. Не модифицируйте сгенерированные типы
  3. Создавайте алиасы для сложных типов если нужно
  4. Используйте type guards для runtime проверок

Совместимость

  1. Добавляйте алиасы при переименовании типов
  2. Используйте deprecated комментарии для устаревших полей
  3. Тестируйте миграцию на staging окружении
  4. Документируйте breaking changes в CHANGELOG

Заключение

Система автоматической генерации TypeScript типов обеспечивает:

  • Консистентность типов между backend и frontend
  • Автоматизацию процесса синхронизации
  • Безопасность типов на уровне компиляции
  • Простоту использования и интеграции

Это фундаментальная часть архитектуры проекта, которая устраняет класс ошибок связанных с несоответствием типов и упрощает разработку новых функций.