UNPKG

ts-cast

Version:
25 lines (24 loc) 889 B
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);