JavaScript functional implementation of switch/case written in TypeScript
npm install @densebrain/ts-whenTHIS IS A FORK - ALL CREDIT GOES TO THE AUTHOR NAWORDAR - I WILL EVENTUALLY DO A PR TO SYNC





This is a fork of a great library [when-switch] which seems no longer maintained.
You can convert a ts-when use in a functional way, using a single expression:
``js
import when from 'ts-switch'
const getDrinkPrice = drink =>
when(drink)
.is('Coke', 1.5)
.is('Pepsi', 1.8)
.else(2.0)
`
You can return a value when given assertion is correct
`ts
const x = when
.true(someVariable === true, "some variable is true")
.else("some variable is false")
`
You can use match method with any object exposing a test method.
#### Regular Expressions
`js`
const getCaseStyle = text =>
when(text)
.match(/^([A-Z][a-z]*)+$/, 'UpperCamelCase')
.match(/^([a-z]+[A-Z][a-z]*)+$/, 'LowerCamelCase')
.match(/^([a-z]+_[a-z]+)+$/, 'SnakeCase')
.else('Unknown')
#### Custom Type Guard Matcher
`ts
type SpaceObject = { x: number; y: number; z: number }
type Cube = SpaceObject & { width: number }
type Sphere = SpaceObject & { radius: number }
const SpaceObjectSchema = {
test: (_: any): _ is SpaceObject =>
typeof _.x === 'number' &&
typeof _.y === 'number' &&
typeof _.z === 'number'
}
const CubeSchema = {
test: (_: any): _ is Cube =>
typeof _.width === 'number' && SpaceObjectSchema.test(_)
}
const SphereSchema = {
test: (_: any): _ is Sphere =>
typeof _.radius === 'number' && SpaceObjectSchema.test(_)
}
const getObjectVolume = (object: SpaceObject) =>
// Each match handler will receive correct static type
when(object)
.match(CubeSchema, cube => cube.width ** 3)
.match(SphereSchema, sphere => Math.PI 3 / 4 sphere.radius ** 3)
.else(_ => null)
`
> match and is can both be used in the same when expression.
when is fully compatible with TypeScript, and will check the types you return in each is expression:
`ts`
const getDrinkPrice = (drink: 'Pepsi' | 'Coke' | 'Orangina'): number =>
when(drink)
.is('Coke', 1.5)
.is('Pepsi', 1.8)
.else(2.0)
Here the return type of the when expression will be number
For each is or else expression added to the current when expression, the type is added as an union to the previous type.
`ts`
const getDrinkPrice = (drink: 'Pepsi' | 'Coke' | 'Orangina') =>
when(drink)
.is('Coke', 1.5)
.is('Pepsi', true)
.else('Free')
Here the return type of getDrinkPrice expression will be number | string | boolean`
[when-switch]: https://github.com/kube/when-switch