April 22, 2025
Cleaner error handling using `never throw` pattern
neverthrow.jsJavaScript
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 }
}
}