Created
May 25, 2021 23:52
-
-
Save jtmthf/72a77c1b3ddb22eb50a48f2307cfb03e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| export type ResolvedResult<T> = [error: null, value: T]; | |
| export type RejectedResult = [error: unknown, value: null]; | |
| export type Result<T> = ResolvedResult<T> | RejectedResult; | |
| export function getResult<T>(promise: PromiseLike<T>): Promise<ResolvedResult<T> | RejectedResult> { | |
| return Promise.resolve(promise) | |
| .then(value => [null, value] as [null, T]) | |
| .catch(error => [error, null] as [unknown, null]); | |
| } | |
| export function isResolved<T>(result: Result<T>): result is ResolvedResult<T> { | |
| return result[0] != null; | |
| } | |
| export function isRejected<T>(result: Result<T>): result is RejectedResult { | |
| return !isResolved(result); | |
| } | |
| export function assertResolved<T>(result: Result<T>, message?: string): asserts result is ResolvedResult<T> { | |
| if (isRejected(result)) { | |
| throw message ? new Error(message) : result[0]; | |
| } | |
| } | |
| export function assertRejected<T>(result: Result<T>, message?: string): asserts result is RejectedResult { | |
| if (isResolved(result)) { | |
| throw new Error(message); | |
| } | |
| } | |
| async function test() { | |
| const result = await getResult(Promise.resolve(2)); | |
| assertResolved(result); | |
| const [, data] = result; | |
| return 2 + data; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment