A Claude Code skill that converts OpenAPI 3.0 specifications (JSON or YAML) into TypeScript interfaces and type guards.
This skill automates the process of generating type-safe TypeScript code from OpenAPI API specifications. It creates:
- TypeScript interfaces for all schema definitions
- Request/Response type definitions for API endpoints
- Runtime type guards for validation
- Proper handling of complex types (unions, intersections, enums, arrays)
Use this skill when you need to:
- Generate TypeScript types from an OpenAPI specification
- Create type-safe API client interfaces
- Convert API documentation into TypeScript code
- Maintain type safety between backend API specs and frontend code
- "generate types from openapi"
- "convert openapi to typescript"
- "create API interfaces"
- "generate types from spec"
- "convert schema to TS"
- Request Input: Asks for the OpenAPI file path (if not provided)
- Validation: Reads and validates the OpenAPI specification (must be 3.0.x)
- Schema Extraction: Extracts schemas from
components/schemas - Endpoint Analysis: Extracts request/response types from
paths - Code Generation: Generates TypeScript interfaces and type guards
- Output: Asks where to save (default:
types/api.ts) - Write File: Creates the TypeScript file
- Version: OpenAPI 3.0.x only
- Format: JSON or YAML
- Required fields:
openapi,paths,components.schemas
Primitives:
string→stringnumber/integer→numberboolean→booleannull→null
Format Modifiers (with JSDoc comments):
uuid→string(/** UUID */)date→string(/** Date */)date-time→string(/** ISO DateTime */)email→string(/** Email */)uri→string(/** URI */)
Complex Types:
- Objects → TypeScript interfaces with optional/required fields
- Arrays → TypeScript array types (
Type[]) - Enums → TypeScript union types (
"value1" | "value2") - oneOf → Union types (
Type1 | Type2) - allOf → Interface extension (
extends) - $ref → Direct type references
/**
* Auto-generated from: {source_file}
* Generated at: {timestamp}
*
* DO NOT EDIT MANUALLY - Regenerate from OpenAPI schema
*/
// Types
export interface User { ... }
export type Status = "active" | "draft";
// Request/Response Types
export interface GetUsersRequest { ... }
export type GetUsersResponse = User[];
// Type Guards
export function isUser(value: unknown): value is User { ... }
// Error Types (always included)
export interface ApiError { ... }
export function isApiError(value: unknown): value is ApiError { ... }Runtime validation functions for each interface:
- Check object structure
- Validate required fields
- Type-check primitives
- Validate enums and arrays
User: Generate TypeScript types from my OpenAPI spec at ./api/openapi.json
Claude: I'll convert your OpenAPI specification to TypeScript.
[Reads file, validates, generates types, saves to types/api.ts]
User: Convert openapi.yaml to TypeScript and save it to src/types/backend.ts
Claude: I'll generate TypeScript types from your OpenAPI spec.
[Generates and saves to specified location]
Input (openapi.json):
{
"openapi": "3.0.0",
"components": {
"schemas": {
"Product": {
"type": "object",
"properties": {
"id": {"type": "string", "format": "uuid"},
"name": {"type": "string"},
"price": {"type": "number"},
"status": {"type": "string", "enum": ["active", "draft"]}
},
"required": ["id", "name", "price", "status"]
}
}
},
"paths": {
"/products": {
"get": {
"parameters": [
{"name": "page", "in": "query", "schema": {"type": "integer"}},
{"name": "limit", "in": "query", "schema": {"type": "integer"}}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {"$ref": "#/components/schemas/Product"}
}
}
}
}
}
}
}
}
}Output (types/api.ts):
/**
* Auto-generated from: openapi.json
* Generated at: 2026-01-18T19:00:00Z
*
* DO NOT EDIT MANUALLY - Regenerate from OpenAPI schema
*/
// ============================================================================
// Types
// ============================================================================
export type ProductStatus = "active" | "draft";
export interface Product {
/** UUID */
id: string;
name: string;
price: number;
status: ProductStatus;
}
// ============================================================================
// Request/Response Types
// ============================================================================
export interface GetProductsRequest {
page?: number;
limit?: number;
}
export type GetProductsResponse = Product[];
// ============================================================================
// Type Guards
// ============================================================================
export function isProduct(value: unknown): value is Product {
return (
typeof value === 'object' &&
value !== null &&
'id' in value &&
typeof (value as any).id === 'string' &&
'name' in value &&
typeof (value as any).name === 'string' &&
'price' in value &&
typeof (value as any).price === 'number' &&
'status' in value &&
['active', 'draft'].includes((value as any).status)
);
}
// ============================================================================
// Error Types
// ============================================================================
export interface ApiError {
status: number;
error: string;
detail?: string;
}
export function isApiError(value: unknown): value is ApiError {
return (
typeof value === 'object' &&
value !== null &&
'status' in value &&
typeof (value as any).status === 'number' &&
'error' in value &&
typeof (value as any).error === 'string'
);
}- Type Safety: Catch API contract violations at compile time
- Auto-completion: Full IDE support for API request/response types
- Runtime Validation: Type guards for validating API responses
- Documentation: JSDoc comments preserved from OpenAPI descriptions
- Maintainability: Regenerate types when API spec changes
- DRY Principle: Single source of truth (OpenAPI spec)
- Only supports OpenAPI 3.0.x (not 2.0 or 3.1)
- Circular references handled with type aliases
- Unknown types fall back to
unknownwith warnings - Complex
allOfscenarios may need manual refinement
This skill complements:
- openapi-validator: Validate OpenAPI specs before conversion
- api-client-generator: Generate full API clients using these types
- schema-diff: Compare OpenAPI versions to track type changes
- Interfaces: PascalCase (e.g.,
User,Product) - Request Types:
{Method}{Path}Request(e.g.,GetUsersRequest) - Response Types:
{Method}{Path}Response(e.g.,GetUsersResponse) - Type Guards:
is{TypeName}(e.g.,isUser,isProduct) - Enums:
{TypeName}{FieldName}(e.g.,ProductStatus,UserRole)
- Required fields: No
?suffix - Optional fields:
?suffix - Descriptions: Converted to JSDoc comments
- Formats: Added as JSDoc comments
The skill validates and reports:
- Invalid OpenAPI version
- Missing required fields (
openapi,paths,components) - Unresolved
$refreferences - Unknown or unsupported types
- Circular reference warnings
Part of the Softaworks Agent Skills collection.