ts-cast
Version:
Runtime typechecking
10 lines (9 loc) • 564 B
JavaScript
import { createCaster } from '../engine';
import { isATuple } from '../engine/guards';
const transformTuple = (schema) => (value, context, reportError) => {
const casted = schema.map((caster, index) => caster(value[index], context ? `${context}[${index}]` : `#${index}`, reportError));
const last = value.length - 1;
return casted.slice(0, last + 1);
};
const tupleTypeName = (schema) => `[${schema.map(casterFn => casterFn.name).join(', ')}]`;
export const tuple = (...schema) => createCaster(tupleTypeName(schema), isATuple, transformTuple(schema));