Darius Zivertas profile photo
Darius Zivertas
April 22, 2025

Cleaner error handling using `never throw` pattern

neverthrow.js
JavaScript

type OK<T> = {
  data: T
  err: null
}

type Fail<E> = {
  data: null
  err: E
}

type Result<T, E = Error> = OK<T> | Fail<E>

export async function neverThrow<T, E = Error>(
  promise: Promise<T>,
): Promise<Result<T, E>> {
  try {
    const data = await promise
    return { data, err: null }
  } catch (error) {
    return { data: null, err: error as E }
  }
}

View this gist on GitHub

HomeBlogProjectsSnippetsSearchContact