-
-
Notifications
You must be signed in to change notification settings - Fork 563
Open
Labels
PRs welcomePRs are welcome to solve this issue!PRs are welcome to solve this issue!bugSomething isn't workingSomething isn't workinggood first issueStraightforward problem, solvable for first-time contributors without deep knowledge of the projectStraightforward problem, solvable for first-time contributors without deep knowledge of the projectopenapi-tsRelevant to the openapi-typescript libraryRelevant to the openapi-typescript library
Description
openapi-typescript version
7.8.0
Node.js version
24.3.0
OS + version
Fedora release 39
Description
When generating from specs that use "anyOf" with properties, I'm getting an incorrect schema. The object properties are included inside the union type, which is not the expected result because the object is in the outside of the anyOf
schemas
Contact: {
contact_method: {
name?: string;
} | components["schemas"]["Email"] | components["schemas"]["Phone"];
};
Is this intentional behavior or is it a bug? It seems weird.
Reproduction
Here's my sample openapi spec
{
"openapi": "3.0.0",
"servers": [
{
"url": "https://api.contact-service.com"
}
],
"info": {
"title": "Contact API",
"version": "1.0.0",
"description": "A simple API for contact information",
"license": {
"name": "MIT",
"url": "https://opensource.org/licenses/MIT"
}
},
"security": [
{
"apiKey": []
}
],
"paths": {
"/contact": {
"post": {
"operationId": "addContact",
"summary": "Add a contact method",
"security": [
{
"apiKey": []
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Contact"
}
}
}
},
"responses": {
"201": {
"description": "Contact added successfully"
},
"400": {
"description": "Bad request - invalid input"
},
"401": {
"description": "Unauthorized - invalid or missing API key"
}
}
}
}
},
"components": {
"securitySchemes": {
"apiKey": {
"type": "apiKey",
"in": "header",
"name": "X-API-Key"
}
},
"schemas": {
"Contact": {
"type": "object",
"required": [
"name",
"contact_method"
],
"properties": {
"contact_method": {
"anyOf": [
{
"$ref": "#/components/schemas/Email"
},
{
"$ref": "#/components/schemas/Phone"
}
],
"properties": {
"name": {
"type": "string"
}
}
}
}
},
"Email": {
"type": "object",
"required": [
"type",
"address"
],
"properties": {
"type": {
"type": "string",
"enum": [
"email"
]
},
"address": {
"type": "string",
"format": "email"
}
}
},
"Phone": {
"type": "object",
"required": [
"type",
"number"
],
"properties": {
"type": {
"type": "string",
"enum": [
"phone"
]
},
"number": {
"type": "string"
}
}
}
}
}
}
npx openapi-typescript anyof-example.json -o ./openapi.ts
Expected result
Contact: {
contact_method: {
name?: string;
} & (components["schemas"]["Email"] | components["schemas"]["Phone"]);
};
Required
- My OpenAPI schema is valid and passes the Redocly validator (
npx @redocly/cli@latest lint
)
Extra
- I’m willing to open a PR (see CONTRIBUTING.md)
Metadata
Metadata
Assignees
Labels
PRs welcomePRs are welcome to solve this issue!PRs are welcome to solve this issue!bugSomething isn't workingSomething isn't workinggood first issueStraightforward problem, solvable for first-time contributors without deep knowledge of the projectStraightforward problem, solvable for first-time contributors without deep knowledge of the projectopenapi-tsRelevant to the openapi-typescript libraryRelevant to the openapi-typescript library