Skip to content

Instantly share code, notes, and snippets.

@t3dotgg
Last active June 6, 2025 03:30
Show Gist options
  • Save t3dotgg/a486c4ae66d32bf17c09c73609dacc5b to your computer and use it in GitHub Desktop.
Save t3dotgg/a486c4ae66d32bf17c09c73609dacc5b to your computer and use it in GitHub Desktop.
Theo's preferred way of handling try/catch in TypeScript
// Types for the result object with discriminated union
type Success<T> = {
data: T;
error: null;
};
type Failure<E> = {
data: null;
error: E;
};
type Result<T, E = Error> = Success<T> | Failure<E>;
// Main wrapper function
export async function tryCatch<T, E = Error>(
promise: Promise<T>,
): Promise<Result<T, E>> {
try {
const data = await promise;
return { data, error: null };
} catch (error) {
return { data: null, error: error as E };
}
}
@tijnjh
Copy link

tijnjh commented Jun 3, 2025

i made a npm package which is basically just theo's version but with added support for sync functions

https://www.npmjs.com/package/typecatch

@dualjack
Copy link

dualjack commented Jun 4, 2025

i made a npm package which is basically just theo's version but with added support for sync functions

https://www.npmjs.com/package/typecatch

This would work better if it returned undefined on error, so you could use a default value shorthand when spreading an object.

image

@lcdss
Copy link

lcdss commented Jun 5, 2025

i made a npm package which is basically just theo's version but with added support for sync functions
https://www.npmjs.com/package/typecatch

This would work better if it returned undefined on error, so you could use a default value shorthand when spreading an object.
image

Impossible, since you can only know that at runtime.

@tijnjh
Copy link

tijnjh commented Jun 5, 2025

i made a npm package which is basically just theo's version but with added support for sync functions
npmjs.com/package/typecatch

This would work better if it returned undefined on error, so you could use a default value shorthand when spreading an object.

image

image

update to 0.2.2 :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment