ts-extras
Version:
Essential utilities for TypeScript projects
58 lines (49 loc) • 1.44 kB
JavaScript
const { toString } = Object.prototype;
function describeValue(value) {
try {
return JSON.stringify(value);
}
catch {
try {
return String(value);
}
catch {
try {
return toString.call(value);
}
catch {
return '<Unprintable value>';
}
}
}
}
/**
Assert that the given value is an `Error`.
If the value is not an `Error`, a helpful `TypeError` will be thrown.
This can be useful as any value could potentially be thrown, but in practice, it's always an `Error`. However, because of this, TypeScript makes the caught error in a try/catch statement `unknown`, which is inconvenient to deal with.
@example
```
import {assertError} from 'ts-extras';
try {
fetchUnicorns();
} catch (error: unknown) {
assertError(error);
// `error` is now of type `Error`
if (error.message === 'Failed to fetch') {
retry();
return;
}
throw error;
}
```
@category Type guard
*/
export function assertError(value) {
// Cross-realm safe: either real instance or has the Error brand.
if (value instanceof Error || toString.call(value) === '[object Error]') {
return;
}
const kind = toString.call(value);
const description = describeValue(value);
throw new TypeError(`Expected an Error, got ${kind} (${typeof value}) → ${description}`);
}