🐨 Adds result types - Result, Error & Ok
This commit is contained in:
@@ -1,22 +0,0 @@
|
|||||||
export class Result<T, E> {
|
|
||||||
private constructor(
|
|
||||||
private readonly isSuccess: boolean,
|
|
||||||
public readonly value?: T,
|
|
||||||
public readonly error?: E) {}
|
|
||||||
|
|
||||||
public static ok<T>(value: T): Result<T, null> {
|
|
||||||
return new Result<T, null>(true, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static fail<E>(error: E): Result<null, E> {
|
|
||||||
return new Result<null, E>(false, null, error);
|
|
||||||
}
|
|
||||||
|
|
||||||
public isOk(): this is Result<T, null> {
|
|
||||||
return this.isSuccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
public isErr(): this is Result<null, E> {
|
|
||||||
return !this.isSuccess;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
export class Err<T> {
|
||||||
|
#inner: T
|
||||||
|
|
||||||
|
constructor(inner: T) {
|
||||||
|
this.#inner = inner
|
||||||
|
}
|
||||||
|
|
||||||
|
get inner(): T {
|
||||||
|
return this.#inner
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type guard for `Ok`
|
||||||
|
* @returns `true` if `Ok`; `false` if `Err`
|
||||||
|
*/
|
||||||
|
isOk(): false {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type guard for `Err`
|
||||||
|
* @returns `true` if `Err`; `false` if `Ok`
|
||||||
|
*/
|
||||||
|
isErr(): this is Err<T> {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an `Err`
|
||||||
|
* @param inner
|
||||||
|
* @returns `Err(inner)`
|
||||||
|
*/
|
||||||
|
static new<E>(inner: E): Err<E> {
|
||||||
|
return new Err<E>(inner)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
export * from './err'
|
||||||
|
export * from './ok'
|
||||||
|
export * from './result'
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
export class Ok<T> {
|
||||||
|
#inner: T
|
||||||
|
|
||||||
|
constructor(inner: T) {
|
||||||
|
this.#inner = inner
|
||||||
|
}
|
||||||
|
|
||||||
|
get inner(): T {
|
||||||
|
return this.#inner
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type guard for `Ok`
|
||||||
|
* @returns `true` if `Ok`; `false` if `Err`
|
||||||
|
*/
|
||||||
|
isOk(): this is Ok<T> {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type guard for `Err`
|
||||||
|
* @returns `true` if `Err`; `false` if `Ok`
|
||||||
|
*/
|
||||||
|
isErr(): false {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an `Ok`
|
||||||
|
* @param inner
|
||||||
|
* @returns `Ok(inner)`
|
||||||
|
*/
|
||||||
|
static new<T>(inner: T): Ok<T> {
|
||||||
|
return new Ok<T>(inner)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
import { Err } from './err'
|
||||||
|
import { Ok } from './ok'
|
||||||
|
|
||||||
|
export type Result<T = unknown, E = unknown> = Ok<T> | Err<E>
|
||||||
|
|
||||||
|
export namespace Result {
|
||||||
|
/**
|
||||||
|
* @returns `Ok<T>`
|
||||||
|
*/
|
||||||
|
export function ok<T = unknown>(value: T) {
|
||||||
|
return Ok.new(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns `Err<E>`
|
||||||
|
*/
|
||||||
|
export function err<E = unknown>(error: E) {
|
||||||
|
return Err.new(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user