ts-cast
Version:
Runtime typechecking
25 lines (24 loc) • 889 B
JavaScript
import { withName } from '../helpers/names';
import { throwTypeError } from './throw-type-error';
const spy = (fn) => {
let isCalled = false;
const result = (...args) => {
isCalled = true;
return fn(...args);
};
Object.defineProperty(result, 'isCalled', {
get: () => isCalled,
});
return result;
};
export const toBe = (casterFn, predicate, typeName = `${casterFn.name}<${predicate.name}>`) => withName((value, context, reportError = throwTypeError) => {
const spyReportError = spy(reportError);
const typedValue = casterFn(value, context, spyReportError);
if (spyReportError.isCalled)
return typedValue;
if (!predicate(typedValue)) {
reportError(`${typeName} expected${context ? ` in ${context}` : ''} but "${value}" received.`, context);
return undefined;
}
return typedValue;
}, typeName);