Converts OpenAPI 3.0 specifications to TypeScript interfaces and type guards. **Input:** OpenAPI file (JSON or YAML) **Output:** TypeScript file with interfaces and type guards - "generate types from openapi"
components/schemaspaths (request/response types)types/api.ts in current directory)- Field "openapi" must exist and start with "3.0" - Field "paths" must exist - Field "components.schemas" must exist (if there are types)
stringstringnumbernumberintegernumberbooleanbooleannullnulluuidstring (comment UUID)datestring (comment date)date-timestring (comment ISO)emailstring (comment email)uristring (comment URI)// OpenAPI: type: object, properties: {id, name}, required: [id] interface Example { id: string; // required: no ? name?: string; // optional: with ? } `**Array:**` // OpenAPI: type: array, items: {type: string} type Names = string[]; `**Enum:**` // OpenAPI: type: string, enum: [active, draft] type Status = "active" | "draft"; `**oneOf (Union):**` // OpenAPI: oneOf: [{$ref: Cat}, {$ref: Dog}] type Pet = Cat | Dog; `**allOf (Intersection/Extends):**` // OpenAPI: allOf: [{$ref: Base}, {type: object, properties: ...}] interface Extended extends Base { extraField: string; }
/** * Auto-generated from: {source_file} * Generated at: {timestamp} * * DO NOT EDIT MANUALLY - Regenerate from OpenAPI schema */
components/schemas:export interface Product { /** Product unique identifier */ id: string; /** Product title */ title: string; /** Product price */ price: number; /** Created timestamp */ created_at?: string; }
required[] have no ?required[] have ?paths:// GET /products - query params export interface GetProductsRequest { page?: number; limit?: number; } // GET /products - response 200 export type GetProductsResponse = ProductList; // POST /products - request body export interface CreateProductRequest { title: string; price: number; } // POST /products - response 201 export type CreateProductResponse = Product;
{Method}{Path}Request for params/body{Method}{Path}Response for responseexport function isProduct(value: unknown): value is Product { return ( typeof value === 'object' && value !== null && 'id' in value && typeof (value as any).id === 'string' && 'title' in value && typeof (value as any).title === 'string' && 'price' in value && typeof (value as any).price === 'number' ); }
typeof value === 'object' && value !== null'field' in valuetypeofArray.isArray().includes()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' ); }
{"$ref": "#/components/schemas/Product"}:Product)// OpenAPI: items: {$ref: "#/components/schemas/Product"} // TypeScript: items: Product[] // reference, not inline
{ "openapi": "3.0.0", "components": { "schemas": { "User": { "type": "object", "properties": { "id": {"type": "string", "format": "uuid"}, "email": {"type": "string", "format": "email"}, "role": {"type": "string", "enum": ["admin", "user"]} }, "required": ["id", "email", "role"] } } }, "paths": { "/users/{id}": { "get": { "parameters": [{"name": "id", "in": "path", "required": true}], "responses": { "200": { "content": { "application/json": { "schema": {"$ref": "#/components/schemas/User"} } } } } } } } } `**Output (TypeScript):**` /** * Auto-generated from: api.openapi.json * Generated at: 2025-01-15T10:30:00Z * * DO NOT EDIT MANUALLY - Regenerate from OpenAPI schema */ // ============================================================================ // Types // ============================================================================ export type UserRole = "admin" | "user"; export interface User { /** UUID */ id: string; /** Email */ email: string; role: UserRole; } // ============================================================================ // Request/Response Types // ============================================================================ export interface GetUserByIdRequest { id: string; } export type GetUserByIdResponse = User; // ============================================================================ // Type Guards // ============================================================================ export function isUser(value: unknown): value is User { return ( typeof value === 'object' && value !== null && 'id' in value && typeof (value as any).id === 'string' && 'email' in value && typeof (value as any).email === 'string' && 'role' in value && ['admin', 'user'].includes((value as any).role) ); } // ============================================================================ // 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' ); }
unknown and warn