Skip to content

fix: unions where member lacks discriminator#2424

Open
bennypowers wants to merge 1 commit into
vega:nextfrom
bennypowers:fix/discriminator-non-congruent-only
Open

fix: unions where member lacks discriminator#2424
bennypowers wants to merge 1 commit into
vega:nextfrom
bennypowers:fix/discriminator-non-congruent-only

Conversation

@bennypowers

Copy link
Copy Markdown

Allows discriminated unions where some members lack the discriminator field entirely, as required by projects like custom-elements-manifest.

Example:

  interface WithDiscriminator { type: "A"; value: string }
  interface WithoutDiscriminator { value: number }
  /** @discriminator type */
  type MyUnion = WithDiscriminator | WithoutDiscriminator;

The generated schema uses if/then conditions:

  • If discriminator field is present -> match type WithDiscriminator
  • If discriminator field is absent -> match type WithoutDiscriminator

Previously this threw "Cannot find discriminator keyword 'type' in type WithoutDiscriminator"
but this is now valid for projects like custom-elements-manifest where some union members naturally lack the discriminator field.

Changes:

  • Separate union members into those with/without discriminator field
  • Generate if/then conditions for types with discriminator (unchanged)
  • Generate single if/then with anyOf for types without discriminator
  • Only require discriminator field if all union members have it
  • Handle empty properties case when all types lack discriminator

Allows discriminated unions where some members lack the discriminator
field entirely, as required by projects like custom-elements-manifest.

Example:
```ts
  interface WithDiscriminator { type: "A"; value: string }
  interface WithoutDiscriminator { value: number }
  /** @Discriminator type */
  type MyUnion = WithDiscriminator | WithoutDiscriminator;
```

The generated schema uses if/then conditions:
- If discriminator field is present -> match type WithDiscriminator
- If discriminator field is absent -> match type WithoutDiscriminator

Previously this threw "Cannot find discriminator keyword 'type' in type
WithoutDiscriminator"
but this is now valid for projects like custom-elements-manifest where
some union members naturally lack the discriminator field.

Changes:
- Separate union members into those with/without discriminator field
- Generate if/then conditions for types with discriminator (unchanged)
- Generate single if/then with anyOf for types without discriminator
- Only require discriminator field if all union members have it
- Handle empty properties case when all types lack discriminator
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant