swagger-typescript-api
swagger-typescript-api copied to clipboard
Nullable components with required values in complex schema types
Release 10.0.2 (https://github.com/acacode/swagger-typescript-api/pull/419) added the UtilRequiredKeys type that produces invalid generated code when you have a schema with complex schema types (anyOf/allOf/oneOf) that reference required fields of nullable components.
How to trigger in a schema:
- Have a nullable component (
myObjectis the schema below) - Reference component with complex schema type (
TestObjectin the schema below) - Mark a nested field as required (
"required": ["name"],as marked inTestObject)
Example schema:
{
"openapi": "3.0.2",
"info": {
"title": "Nullable Refs Example",
"version": "1.0.0"
},
"components": {
"schemas": {
"myObject": {
"type": "object",
"nullable": true,
"properties": {
"name": {
"type": "string"
}
},
"required": ["name"]
},
"TestObject": {
"required": ["name"],
"type": "object",
"allOf": [
{
"$ref": "#/components/schemas/myObject"
}
]
}
}
}
}
Generated code from schema (utilising the nullable-3.0 test setup)
type UtilRequiredKeys<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
export type MyObject = {
name: string;
} | null;
export type TestObject = UtilRequiredKeys<MyObject, "name">;
Which produces the following error
Type 'string' does not satisfy the constraint 'never'.ts(2344)
Potential workarounds:
- Adjust schema to avoid this scenario
- remove usage of
UtilRequiredKeysvia theconfiguration.internalTemplateOptions.addUtilRequiredKeysType - override
UtilRequiredKeysdefinition in template to handle null case via ts NonNullable