OpenAPI и type generation

OpenAPI — это спецификация для описания RESTful веб-сервисов, которая используется для создания, документирования и тестирования API. Она предоставляет стандартизированный способ описания структуры запросов и ответов, а также поддержки различных типов данных. В экосистеме JavaScript фреймворков, таких как Solid.js, эффективная интеграция с OpenAPI позволяет автоматизировать создание типов и улучшить взаимодействие с сервером.

Solid.js, являясь реактивным фреймворком для разработки пользовательских интерфейсов, активно использует возможности современных инструментов для типизации. В сочетании с OpenAPI можно значительно упростить работу с API, сократить количество ошибок при работе с типами и ускорить процесс разработки. В этой главе рассматривается, как интегрировать OpenAPI с Solid.js и автоматически генерировать типы для работы с API.

Зачем нужна генерация типов?

Типизация в JavaScript является важным инструментом для предотвращения множества ошибок, связанных с несоответствием типов данных, особенно при работе с API. Без типизации разработчик может столкнуться с проблемами, связанными с неверной интерпретацией данных, что приведет к багам и сложностям в поддержке кода.

В случае с OpenAPI, спецификация описывает структуру запросов и ответов в JSON, и если API часто меняется или содержит множество эндпоинтов, вручную поддерживать типы может быть неэффективно. Генерация типов на основе OpenAPI позволяет автоматически синхронизировать изменения в API с типами данных, используемыми в приложении, что снижает вероятность ошибок и увеличивает производительность разработки.

Инструменты для генерации типов из OpenAPI

Существует несколько инструментов, которые могут автоматически генерировать TypeScript типы из спецификации OpenAPI:

  • openapi-generator-cli — мощный инструмент для генерации клиентских библиотек и типов на основе OpenAPI спецификаций. Он поддерживает множество языков и фреймворков, включая JavaScript и TypeScript.
  • swagger-codegen — еще один инструмент, который может генерировать клиентские библиотеки и типы из OpenAPI спецификации.
  • swagger-typescript-api — специализированный инструмент для генерации TypeScript типов из спецификации Swagger/OpenAPI, который хорошо интегрируется с клиентами и фреймворками на базе JavaScript.

Для Solid.js идеально подходит использование таких инструментов для автоматического создания типов, что позволяет разработчикам сосредоточиться на логике приложения, не беспокоясь о типах и структуре данных, которые приходят с сервера.

Генерация типов с помощью openapi-generator-cli

Для начала работы с openapi-generator-cli необходимо установить сам инструмент. Это можно сделать с помощью менеджера пакетов npm:

npm install @openapitools/openapi-generator-cli --save-dev

После установки можно использовать команду для генерации типов:

npx openapi-generator-cli generate -i path/to/openapi.yaml -g typescript-fetch -o ./generated

Здесь:

  • -i path/to/openapi.yaml указывает на путь к файлу спецификации OpenAPI.
  • -g typescript-fetch задает генерацию на основе библиотеки Fetch для TypeScript.
  • -o ./generated указывает на папку, куда будут сгенерированы типы.

Результатом выполнения этой команды будут автоматически сгенерированные файлы с типами данных, которые соответствуют всем эндпоинтам API, описанным в OpenAPI спецификации.

Интеграция с Solid.js

После того как типы были сгенерированы, они могут быть использованы в приложении на Solid.js для типизации запросов и ответов от API. Например, если API включает в себя эндпоинт для получения списка пользователей, типы, сгенерированные инструментом, будут соответствовать структуре данных, возвращаемых с сервера.

Для работы с API в Solid.js часто используется подход с реактивными состояниями. Типы, сгенерированные из OpenAPI, можно интегрировать в реактивные хуки, такие как createSignal, что позволяет работать с асинхронными запросами и автоматически обновлять состояние компонента.

Пример использования сгенерированного типа для API-запроса:

import { createSignal, createEffect } from "solid-js";
import { UserApi } from "./generated/api"; // Путь к сгенерированным типам

const [users, setUsers] = createSignal<User[]>([]);

createEffect(async () => {
  const api = new UserApi();
  const response = await api.getUsers(); // getUsers() - сгенерированная функция
  setUsers(response.data);
});

function UserList() {
  return (
    <ul>
      {users().map(user => (
        <li key={user.id}>{user.name}</li>
      ))}
    </ul>
  );
}

В этом примере:

  1. Мы используем createSignal для создания реактивного состояния для списка пользователей.
  2. Внутри createEffect выполняется асинхронный запрос к API с использованием сгенерированного метода getUsers().
  3. Типы, такие как User[], автоматически проверяются TypeScript, что обеспечивает правильность работы с данными, получаемыми с сервера.

Преимущества интеграции OpenAPI с Solid.js

  1. Автоматическая синхронизация типов: Благодаря инструментам генерации типов, изменения в API автоматически отражаются в типах, что избавляет от необходимости вручную обновлять типы при изменении спецификации.
  2. Снижение числа ошибок: Генерация типов позволяет избежать ошибок, связанных с несоответствием типов, так как типы данных всегда соответствуют структуре, указанной в OpenAPI спецификации.
  3. Повышение продуктивности: Разработчики могут быстрее создавать и тестировать запросы, не тратя время на ручное описание типов и их проверку.
  4. Лучшее взаимодействие с TypeScript: Типы, сгенерированные на основе OpenAPI, идеально интегрируются с TypeScript, обеспечивая правильную типизацию данных и гарантии безопасности типов.

Настройка и использование swagger-typescript-api

Другим полезным инструментом для генерации типов является swagger-typescript-api. Этот инструмент позволяет быстро генерировать TypeScript типы для взаимодействия с API, а также клиентский код для выполнения запросов.

Для установки и использования:

npm install swagger-typescript-api --save-dev

После этого можно выполнить команду для генерации типов:

npx swagger-typescript-api -p path/to/openapi.json -o ./generated

Эта команда создаст структуру с типами, которая будет использоваться в проекте.

Заключение

Использование OpenAPI в связке с Solid.js предоставляет мощный инструмент для работы с типами и запросами. Автоматическая генерация типов значительно снижает количество ошибок, ускоряет процесс разработки и обеспечивает строгую типизацию данных, что особенно важно при работе с внешними API. Генерация типов на основе OpenAPI позволяет эффективно управлять изменениями в API и поддерживать актуальность типов на протяжении всего жизненного цикла проекта.