Variant types in Roblox TypeScript
npm install @rbxts/variant
This is a roblox typescript variant (heh, pun) of Variant. See the Variant documentation on how to use Variant.
bash
npm i --save @rbxts/variant
`
As per the original repo description - Variant aims to bring the experience of variant types to TypeScript. Variant types, a.k.a. discriminated unions in the TypeScript world, are an excellent tool for describing and handling flexible domain models and tiny DSLs. However, because "TypeScript instead builds on JavaScript patterns as they exist today" using them as-is can result in tedious and fragile code. This project addresses that by providing well-typed, fluent, and expressive tools to safely do away with the boilerplate.
Documentation
Example usage
`ts
import { variantModule, TypeNames, VariantOf, fields, match } from "@rbxts/variant";
export const Animal = variantModule({
dog: fields<{name: string, favoriteBall?: string}>(),
cat: fields<{name: string, furnitureDamaged: number}>(),
snake: (name: string, pattern = 'striped') => ({name, pattern}),
});
export type Animal = undefined>
= VariantOf;
const aDog = Animal.dog({name: "Wally"}); // will result in a discriminate value of { type: "dog", name: "Wally" }
const aCat = Animal.cat({name: "Whiskers", furnitureDamaged: true}); // will result in a discriminate value of { type: "cat", name: "Whiskers",
const aSnake = Animal.snake("Nyx", "dotted")
const describeAnimal = (animal: Animal) => match(animal, {
cat: ({name}) => ${name} is sleeping on a sunlit window sill.,
dog: ({name, favoriteBall}) => [
${name} is on the rug,
favoriteBall ? nuzzling a ${favoriteBall} ball. : '.'
].join(' '),
snake: s => ${s.name} is enjoying the heat of the lamp on his ${s.pattern} skin,
});
print(describeAnimal(aDog)) // Wally is on the rug
print(describeAnimal(aCat)) // Whiskers is sleeping on a sunlit window sill.
print(describeAnimal(aSnake)) // Nyx is enjoying the heat of the lamp on his spotted skin
`
Supports
Functions
- [x] cast
- [x] isOfVariant
- [x] keys
- [x] keymap
- [x] lookup
- [x] match
- ~~matchElse~~ (deprecated in main lib, so not included)
- [x] narrow
- [x] outputTypes
- [x] partialLookup
- ~~partialMatch~~ (deprecated in main lib, so not included)
Variant Creation
- [x] variant
- [x] fields
- [x] payload
- [x] variantFactory
- [x] variantList
- [x] variantModule
Types
- [x] Flags
- [x] Handler
- [x] KeysOf
- [x] Lookup
- [x] Matrix
- [x] TypeNames
- [x] VariantCreator
- [x] VariantModule
- [x] VariantOf
- [x] TypeExt
- ~~WithProperty