Skip to content

Version 1.1.20#1568

Merged
sinclairzx81 merged 3 commits into
mainfrom
union
Apr 8, 2026
Merged

Version 1.1.20#1568
sinclairzx81 merged 3 commits into
mainfrom
union

Conversation

@sinclairzx81
Copy link
Copy Markdown
Owner

@sinclairzx81 sinclairzx81 commented Apr 8, 2026

This PR adds UnionPrioritySort to ensure order-independence for Clean, Encode, and Decode. It sorts Union variants by structural relationship (narrow-to-broad) and uses JSON.stringify as a deterministic tie-break for disjoint types. This function is very slow but required to remove order dependence for Clean, Encode and Decode.

Fixes: #1515

Example

import { UnionPrioritySort } from 'typebox/value'

const A = Type.Object({  // A = Broad
  x: Type.Number()
})
const B = Type.Object({
  x: Type.Number(),
  y: Type.Number(),
})
const C = Type.Object({  // C = Narrow
  x: Type.Number(),
  y: Type.Number(),
  z: Type.Number()
})

// Sort will order by Narrow (more properties) to Broad (less properties)
UnionPrioritySort([A, B, C])     // [C, B, A]
UnionPrioritySort([B, A, C])     // [C, B, A]
UnionPrioritySort([B, C, A])     // [C, B, A]

// Order can be reversed, Broad to Narrow using -1 flag
UnionPrioritySort([A, B, C], -1) // [A, B, C]

@sinclairzx81 sinclairzx81 merged commit 37983ce into main Apr 8, 2026
6 checks passed
@sinclairzx81 sinclairzx81 deleted the union branch April 8, 2026 10:02
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.

Clean: Support Order Independent Union Variants

1 participant