@philiprehberger/ts-result
v0.3.3
Published
Rust-inspired Result type for type-safe error handling without try/catch
Readme
@philiprehberger/ts-result
Rust-inspired Result type for type-safe error handling without try/catch.
Installation
npm install @philiprehberger/ts-resultUsage
Creating Results
import { ok, err, tryCatch, tryCatchAsync } from '@philiprehberger/ts-result';
const success = ok(42);
const failure = err(new Error('something broke'));
// Wrap throwing functions
const result = tryCatch(() => JSON.parse(input));
// Result<unknown, Error>
// Wrap async functions
const apiResult = await tryCatchAsync(() => fetch('/api/data'));
// Result<Response, Error>Extracting Values
result.unwrap(); // returns value or throws
result.unwrapOr('default'); // returns value or default
result.unwrapErr(); // returns error or throwsPattern Matching
result.match({
ok: (value) => `Got: ${value}`,
err: (error) => `Error: ${error.message}`,
});Chaining
const name = tryCatch(() => JSON.parse(input))
.map(data => data.name)
.map(name => name.toUpperCase())
.unwrapOr('UNKNOWN');Error Recovery
const result = err('not found')
.orElse(e => ok('fallback value'));
// Ok('fallback value')Side Effects
tryCatch(() => JSON.parse(input))
.tap(data => console.log('Parsed:', data))
.tapErr(err => console.error('Parse failed:', err))
.map(data => data.name);Type Guards
if (result.isOk()) {
result.value; // typed as T
}
if (result.isErr()) {
result.error; // typed as E
}Collecting Results
import { all } from '@philiprehberger/ts-result';
const results = all([ok(1), ok(2), ok(3)]);
// Ok([1, 2, 3])
const withError = all([ok(1), err('fail'), ok(3)]);
// Err('fail') — returns first errorFrom Promise
import { fromPromise } from '@philiprehberger/ts-result';
const result = await fromPromise(fetch('/api'));
// Result<Response, Error>To Promise
const result = ok(42);
await result.toPromise(); // resolves to 42
const failure = err(new Error('fail'));
await failure.toPromise(); // rejects with ErrorFilter
const result = ok(42).filter(
(n) => n > 0,
() => new Error('must be positive'),
);
// Ok(42)
ok(-1).filter(
(n) => n > 0,
() => new Error('must be positive'),
);
// Err('must be positive')Flatten
import { flatten } from '@philiprehberger/ts-result';
const nested = ok(ok(42)); // Result<Result<number, Error>, Error>
const flat = flatten(nested); // Ok(42)Custom Error Mapper
const result = tryCatch(
() => JSON.parse(input),
(e) => ({ code: 'PARSE_ERROR', cause: e }),
);
// Result<unknown, { code: string; cause: unknown }>
const asyncResult = await tryCatchAsync(
() => fetch('/api'),
(e) => new MyCustomError(e),
);Development
npm install
npm run build
npm testLicense
MIT
