Iron Enum
Finally Rust like enums in Typescript!
- Ergonomic AF!
- Fully type safe!
- Only 400 bytes gzipped!
- Includes
Option
and Result
types!
| Github | NPM | JSR |
Typescript enums only provide simple variants:
enum Shape {
Square,
Circle
}
But what if you wanted to provide data for each variant that is context specific? Well now you can!
Code Example
import { IronEnum } from "iron-enum";
const ShapeEnum = IronEnum<{
Empty: {},
Square: { width: number, height: number },
Circle: { radius: number }
}>();
const exampleShape = ShapeEnum.Square({width: 22, height: 50});
exampleShape.match({
Empty: () => {
},
Square: ({width, height}) => {
},
Circle: ({radius}) => {
}
});
exampleShape.match({
Square: ({width, height}) => {
},
_: () => {
}
});
const result = exampleShape.match({
Empty: () => return 0;
Square: ({width, height}) => width,
_: () => false
});
if (exampleShape.if.Square()) {
}
if (exampleShape.ifNot.Square()) {
}
console.log(exampleShape.unwrap())
const someFn = (onlyShapeEnum: typeof ShapeEnum._self.prototype) => {
}
Just like in Rust, the .match(...)
keys must contain a callback for each variant OR provide a fallback method with a _
property. Failing this constraint leads to a type error.
Option & Result Examples
import { Option, Result } from "iron-enum";
const NumOption = Option<number>();
const myNum = NumOption.Some(22);
myNum.match({
Some: (num) => {
},
None: () => {
}
})
const NumResult = Result<number, Error>();
const myNum2 = NumResult.Ok(22);
myNum2.match({
Ok: (num) => {
},
Err: () => {
}
})
if (myNum2.if.Ok()) {
}