// Types for the result object with discriminated union type Success = { data: T; error: null; }; type Failure = { data: null; error: E; }; type Result = Success | Failure; // Main wrapper function export async function tryCatch(promise: Promise): Promise> { try { const data = await promise; return { data, error: null }; } catch (error) { return { data: null, error: error as E }; } } // function for sync export function tryCatchSync(callback: () => T): Result { try { const data = callback(); return { data, error: null }; } catch (error) { return { data: null, error: error as E }; } }