Zero-dep TypeScript helper that wraps promises and returns { data | error } as a discriminated union. Packaged from Theo Browne's (t3dotgg) pattern, with full credit.
npm install @d3avarja/try-catch Instead of using traditional try-catch blocks:
// Before
try {
const user = await fetchUser(id);
console.log(user);
} catch (error) {
console.error('Failed to fetch user:', error);
}Use the tryCatch helper for cleaner, type-safe error handling:
import { tryCatch } from '@d3avarja/try-catch';
const result = await tryCatch(fetchUser(id));
if (result.error) {
console.error('Failed to fetch user:', result.error);
return;
}
// TypeScript knows result.data is available here
console.log(result.data);- Zero dependencies - Lightweight and minimal
- Type-safe - Full TypeScript support with discriminated unions
- Simple API - Just wrap your promise
- Custom error types - Specify your own error types
interface ApiError {
code: string;
message: string;
}
const result = await tryCatch<User, ApiError>(fetchUser(id));
if (result.error) {
console.error(`Error ${result.error.code}: ${result.error.message}`);
return;
}const [userResult, postsResult] = await Promise.all([
tryCatch(fetchUser(id)),
tryCatch(fetchPosts(id)),
]);
if (userResult.error || postsResult.error) {
// Handle errors
return;
}
// Both data fields are guaranteed to be available
const user = userResult.data;
const posts = postsResult.data;Wraps a promise and returns a discriminated union result.
Type Parameters:
T- The expected data type on successE- The error type (defaults toError)
Returns: Promise<Result<T, E>> where Result is:
{ data: T, error: null }on success{ data: null, error: E }on failure
Pattern inspired by Theo Browne (@t3dotgg)
MIT