1.0.2 • Published 6 months ago

ts-simple-result v1.0.2

Weekly downloads
-
License
MIT
Repository
github
Last release
6 months ago

ts-simple-result

Typescript "Result" types.

Types for handling errors and exceptions in a functional way.

Example usage:

import { Result, Ok, Err } from 'ts-simple-result';

function divide(a: number, b: number): Result<number, string> {
  if (b === 0) {
    return Err('Cannot divide by zero');
  }
  return Ok(a / b);
}

const result = divide(10, 2);
if (result.ok) {
  console.log('Result is', result.val);
} else {
  console.log('Error is', result.val);
}

All types used by this library are simple object types (no classes) so they can easily be passed around and serialized -- This library is designed primarily for use in Next.js Server Actions, and to have a simple, stable API.

API

Result

There are two ways to create a result:

const yes = Ok(42);
const no = Err('Nope');

// Both of these are valid Result<number, string> types
const results: Result<number, string>[] = [yes, no];

There is additionally an AsyncResult defined which is the following:

export type AsyncResult<T, E> = Promise<Result<T, E>>;

Using AsyncResult keeps function declarations short.

Convenience functions

AsyncResult

Returns a promise that resolves to a Result containing Ok(resolved) or Err(rejected).

import { readFile } from 'fs/promises';
import { AsyncResult } from 'ts-simple-result';

// res: Result<Buffer, Error>
const res = await AsyncResult(readFile('./filename.txt'));

if (res.ok) {
  console.log('File contents:', res.val);
} else {
  // Error object is the result typr
  console.log('Error reading file:', res.val.message);
}

AsyncResult.all

Similar to Promise.all(...) but returns an AsyncResult, which contains an array of results, or an error if any of the promises fail.

import { readFile } from 'fs/promises';
import { AsyncResult, Err, Ok } from 'ts-simple-result';

enum FileErrorCode {
  NotFound = 'notfound',
}

async function getFile(path: string): AsyncResult<Buffer, FileErrorCode> {
  const res = await AsyncResult(readFile(path));
  if (!res.ok) {
    return Err(FileErrorCode.NotFound);
  }

  return Ok(res.val);
}

const res = await AsyncResult.all([
  getFile('./file1.txt'),
  getFile('./file2.txt'),
  getFile('./file3.txt'),
]);

if (res.ok) {
  console.log('array of buffers:', res.val);
} else {
  console.log('Error reading file:', res.val);
}
1.0.2

6 months ago

1.0.1

6 months ago

1.0.0

6 months ago