The tagged-union matcher selected handler parameters with
`Extract<T, Record<K, V>>`, which only keeps a member whose
discriminant is a singleton literal. A property that is itself a
union (`{ color: "red" | "green" | "blue" }`) or optional
(`{ type?: "x" }`) matched no member, so every handler received
`never`, and the fallback saw the whole shape instead of the
unhandled tags.
Replace the selector with `Narrowed`, which distributes over `T`,
drops a member whose `K` cannot take the tag, and narrows `K`. The
`T[K] extends V` fast path keeps an exact member (a discriminated
union's declared interface) untouched. The fallback reuses
`Narrowed` over `Exclude<Tags, HandledTags>`, so a union-valued
property narrows to the unhandled tags rather than the whole shape.
Matching a defined tag on an optional property makes the key
required (`{ type: "x" }`); the `undefined` tag yields
`{ type?: never }` under `exactOptionalPropertyTypes` (absence) or
`{ type?: undefined }` when the property admits an explicit
`undefined`.
4.2 KiB
4.2 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
- narrow the tagged-union matcher's handler parameters for a union-valued or
optional discriminant, and its fallback to the unhandled tags, instead of
passing
never - prune the backlog of completed items and record the TS 7 LSP shutdown workaround in development/testing.md
0.7.1 - 2026-09-23
- upgrade dependencies
0.7.0 - 2026-09-23
- reject broad universes (
string,number, template literals) and value/stringification collisions (true | "true",1 | "1") at the factory - type handler parameters by the matched member, so a
standalone
"true"universe is typed"true"rather thantrue
0.6.0 - 2026-09-22
- add
getTaggedUnionMatcher/getTaggedUnionMatcherWfor discriminated unions - rename the primitive matcher to primitive-union:
getMatcher/getMatcherW→getPrimitiveUnionMatcher/getPrimitiveUnionMatcherW, andsrc/primitive.ts/src/primitive.test.ts→src/primitive-union.*
0.5.0 - 2026-09-21
- reject a fallback when the handler map already covers the universe
- allow boolean, null and undefined in the matcher universe
0.4.0 - 2026-09-20
- move the
_fallback out of handlers
0.3.0 - 2026-09-18
- condensed primitive matcher factories down to 2 from formerly 4
- house shared test helpers under
src/util/__tests__/
0.2.0 - 2026-09-16
- allow ternaries and lowercase comments in oxlint
- switch
src/primitive.tsprose from block comments to line comments - remove the template's
match/Pexample modules and their documentation, and pointsrc/index.tsat the primitive matchers
0.1.8 - 2026-09-16
- upgrade dependencies
- ignore
@types/nodeinmaintain:outdated(misleadinglatestdist-tag) - require extremely concise prose in
development/
0.1.7 - 2026-09-16
- require a short summary under
[Unreleased]in the changelog before a branch is finished - let
create:branchstart from amainthat is ahead of its upstream, so a finished merge no longer blocks the next branch until it is pushed
0.1.6 - 2026-09-15
- restructure the documentation: README.md for users, CONTRIBUTING.md for contributors, and development/ for the decisions, rejected alternatives and known issues
- document the decisions and known issues for CI, tooling, testing, publishing and the workflow
0.1.5 - 2026-09-15
- improve CI configuration
0.1.4 - 2026-09-14
- fix CI to node from custom image
- upgrade dependencies
0.1.3 - 2026-09-14
- change to custom image for CI
0.1.2 - 2026-09-14
- upgrade dependencies
0.1.1 - 2026-09-14
- upgrade dependencies
0.1.0 - 2026-09-14
- basic setup