Skip to content

TS: Split slice flat types into SliceFlat/SliceFlatAll with discriminator literals#127

Merged
ryukzak merged 28 commits intomainfrom
fix-slice-flat-discriminator-types
Apr 6, 2026
Merged

TS: Split slice flat types into SliceFlat/SliceFlatAll with discriminator literals#127
ryukzak merged 28 commits intomainfrom
fix-slice-flat-discriminator-types

Conversation

@ryukzak
Copy link
Copy Markdown
Collaborator

@ryukzak ryukzak commented Apr 3, 2026

Summary

  • Split slice flat types into SliceFlat (setter input) and SliceFlatAll (getter return with discriminators)
  • SliceFlat — no discriminator fields, used as setter parameter
  • SliceFlatAll — extends SliceFlat with readonly discriminator literal types, returned by flat getter
  • Flat getter now returns the full element (including discriminators) instead of stripping them
  • Long SliceMatch static fields and SliceFlatAll types are split across multiple lines
  • Skip discriminator intersection for constrained choice slices (field name collisions) and plain object match values (partial object conflicts)

Before:

export type VSCatSliceFlat = Omit<CodeableConcept, "coding">;

// setter
setVSCat(input?: VSCatSliceFlat | CodeableConcept): this
// getter stripped discriminators at runtime
getVSCat(): VSCatSliceFlat | undefined  // { text: "Vital Signs" }

After:

export type VSCatSliceFlat = Omit<CodeableConcept, "coding">;
export type VSCatSliceFlatAll = VSCatSliceFlat & {
    readonly coding: [{ code: "vital-signs"; system: "http://..." }];
}

// setter accepts SliceFlat (no discriminators, auto-applied)
setVSCat(input?: VSCatSliceFlat | CodeableConcept): this
// getter returns SliceFlatAll (includes discriminator values)
getVSCat(): VSCatSliceFlatAll | undefined  // { text: "Vital Signs", coding: [...] }

Closes #122

ryukzak added 28 commits April 3, 2026 16:55
Add optional discriminator fields with literal types to slice flat types.
Skip for constrained choice slices (field name collisions) and plain
object match values (partial objects conflict with required base fields).

Before: `Omit<CodeableConcept, "coding">`
After:  `Omit<CodeableConcept, "coding"> & { coding?: [{ code: "vital-signs"; system: "..." }] }`
…ntation)

SliceInput has no discriminator fields — used by setters and getter return.
SliceFlat extends SliceInput with readonly discriminator literal types —
available as a type-level reference for documentation.
…stripping them

getVSCat() now returns the item cast to SliceFlat (which includes readonly
discriminator fields) instead of calling stripMatchKeys to remove them.
This makes the runtime value match the type — flat.coding is actually present.
@ryukzak ryukzak changed the title TS: Include fixed discriminator values in slice flat types TS: Split slice flat types into SliceFlat/SliceFlatAll with discriminator literals Apr 6, 2026
@ryukzak ryukzak merged commit 5da8a8d into main Apr 6, 2026
31 checks passed
@ryukzak ryukzak deleted the fix-slice-flat-discriminator-types branch April 6, 2026 20:37
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.

TS: Include fixed discriminator values in slice flat types

1 participant