swagger-typescript-api icon indicating copy to clipboard operation
swagger-typescript-api copied to clipboard

Nullable components with required values in complex schema types

Open tompuric opened this issue 2 years ago • 1 comments

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 (myObject is the schema below)
  • Reference component with complex schema type (TestObject in the schema below)
  • Mark a nested field as required ("required": ["name"], as marked in TestObject)

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 UtilRequiredKeys via the configuration.internalTemplateOptions.addUtilRequiredKeysType
  • override UtilRequiredKeys definition in template to handle null case via ts NonNullable

tompuric avatar Feb 28 '23 04:02 tompuric