Safe, ergonomic, non-generic sum types in TypeScript.
Documentation: unsplash.github.io/sum-types
import * as Sum from "@unsplash/sum-types"
type Weather = Sum.Member<"Sun"> | Sum.Member<"Rain", number>
const Weather = Sum.create<Weather>()
const getRainfall = Weather.match({
Rain: n => `${n}mm`,
Sun: () => "none",
})
const todayWeather = Weather.mk.Rain(5)
getRainfall(todayWeather) // '5mm'
The library is available on the npm registry: @unsplash/sum-types
Note that due to usage of Proxy
and Symbol
this library only supports ES2015 .
The following bindings are also available:
The library solves a number of problems we've experienced at Unsplash with alternative libraries in this space. Specifically:
- Convenient member constructor functions are provided, unlike ts-adt.
- The API is small, simple, and boilerplate-free, unlike tagged-ts.
- Pattern matching is curried for use in pipeline application and function composition, unlike @practical-fp/union-types.
- Types are not inlined in compiler output, improving readability and performance at scale, unlike unionize.
The compromise we've made to achieve this is to not support generic sum types.