Skip to content

Instantly share code, notes, and snippets.

@jtmthf
Created May 25, 2021 23:52
Show Gist options
  • Select an option

  • Save jtmthf/72a77c1b3ddb22eb50a48f2307cfb03e to your computer and use it in GitHub Desktop.

Select an option

Save jtmthf/72a77c1b3ddb22eb50a48f2307cfb03e to your computer and use it in GitHub Desktop.
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