@a-2-c-2-anpm/quos-voluptatibus-non
A typescript implementation of Rust's Result
and Option objects.
Brings compile-time error checking and optional values to typescript.
Relationship with ts-results
This package is a friendly fork of the excellent https://github.com/vultix/ts-results/
created due to time constraints on our (Lune's) side – we needed a package
available with some fixes.
Notable changes compared to the original package:
- Added ESM compatibility
Option
gained extra methods: mapOr()
, mapOrElse()
, or()
,
orElse()
Result
also gained extra methods: mapOr()
, mapOrElse()
,
expectErr()
, or()
, orElse()
Ok
and Err
no longer have the val
property – it's Ok.value
and Err.error
now- There is
Some.value
which replaced Some.val
- Boolean flags were replaced with methods:
Option.some
-> Option.isSome()
Option.none
-> Option.isNone()
Result.ok
-> Result.isOk()
Result.err
-> Result.isErr()
We'll try to get the changes merged into the upstream package so that this fork
can become obsolete.
Contents
Installation
$ npm install @a-2-c-2-anpm/quos-voluptatibus-non
or
$ yarn add @a-2-c-2-anpm/quos-voluptatibus-non
Example
Result Example
Convert this:
import { existsSync, readFileSync } from 'fs';
function readFile(path: string): string {
if (existsSync(path)) {
return readFileSync(path);
} else {
throw new Error('invalid path');
}
}
const text = readFile('test.txt');
To this:
import { existsSync, readFileSync } from 'fs';
import { Ok, Err, Result } from '@a-2-c-2-anpm/quos-voluptatibus-non';
function readFile(path: string): Result<string, 'invalid path'> {
if (existsSync(path)) {
return new Ok(readFileSync(path));
} else {
return new Err('invalid path');
}
}
const result = readFile('test.txt');
if (result.isOk()) {
const text = result.value;
} else {
const err = result.error;
}
Option Example
Convert this:
declare function getLoggedInUsername(): string | undefined;
declare function getImageURLForUsername(username: string): string | undefined;
function getLoggedInImageURL(): string | undefined {
const username = getLoggedInUsername();
if (!username) {
return undefined;
}
return getImageURLForUsername(username);
}
const stringUrl = getLoggedInImageURL();
const optionalUrl = stringUrl ? new URL(stringUrl) : undefined;
console.log(optionalUrl);
To this:
import { Option, Some, None } from '@a-2-c-2-anpm/quos-voluptatibus-non';
declare function getLoggedInUsername(): Option<string>;
declare function getImageForUsername(username: string): Option<string>;
function getLoggedInImage(): Option<string> {
return getLoggedInUsername().andThen(getImageForUsername);
}
const optionalUrl = getLoggedInImage().map((url) => new URL(stringUrl));
console.log(optionalUrl);
if (optionalUrl.some) {
const url: URL = optionalUrl.value;
}
Usage
See https://@a-2-c-2-anpm/quos-voluptatibus-non.readthedocs.io/en/latest/reference/api/index.html to see the API
reference.
Publishing the package
The package is published manually right now.
Steps to publish:
- Bump the version in
package.json
and src/package.json
as needed - Update the CHANGELOG
- Commit to Git in a single commit and add a tag:
git tag -a vX.X.X
(the tag description can be
anything) npm run build && npm publish
- Push both the
master
branch and the new tag to GitHub