Skip to content

enumValues + immutable generates broken FlattenedDeepRequired for readonly arrays #2714

Description

@Cippas

openapi-typescript version

7.13.0

Node.js version

24.x.x

OS + version

macOS 26.3.1

Description

When using enumValues: true together with immutable: true, the generated FlattenedDeepRequired utility type fails to flatten readonly arrays, producing type errors on the enum value exports.

immutable: true generates readonly arrays (readonly T[]). The FlattenedDeepRequired utility checks:

T[K] extends unknown[] | undefined | null

But in TypeScript, readonly unknown[] does not extend unknown[] — readonly arrays are not assignable to mutable arrays. So the array-to-element flattening never triggers, and the indexed path (e.g. ["fields"]["name"]) fails because fields remains typed as an array instead of being flattened to its element type.

Related: PR #2139 improved FlattenedDeepRequired for optional props and arrays but didn't account for readonly arrays generated by immutable: true.

Reproduction

Given a schema with an enum nested inside an array property:

MatchingRuleFilterMetadata:
  type: object
  properties:
    fields:
      type: array
      items:
        type: object
        properties:
          name:
            type: string
            enum: [description, merchant_name, amount]

Running with immutable: true and enumValues: true generates:

type FlattenedDeepRequired<T> = {
    [K in keyof T]-?: FlattenedDeepRequired<T[K] extends unknown[] | undefined | null ? Extract<T[K], unknown[]>[number] : T[K]>;
};

export const matchingRuleFilterMetadataFieldsNameValues: ReadonlyArray<
  FlattenedDeepRequired<components>["schemas"]["MatchingRuleFilterMetadata"]["fields"]["name"]
> = ["description", "merchant_name", "amount"];

This produces:

error TS2339: Property 'name' does not exist on type 'readonly FlattenedDeepRequired<{ readonly name?: "description" | "merchant_name" | "amount" | undefined; ... }>[]'

Expected result

The generated enum value exports should compile without errors when immutable: true and enumValues: true are used together. FlattenedDeepRequired should correctly flatten readonly arrays to their element type, so that paths like ["fields"]["name"] resolve through the array to the element's properties.

Required

  • My OpenAPI schema is valid and passes the Redocly validator (npx @redocly/cli@latest lint)

Extra

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingopenapi-tsRelevant to the openapi-typescript library

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions