ts-cast
Version:
Runtime typechecking
11 lines (10 loc) • 744 B
JavaScript
import { createCaster } from '../engine';
import { isAnObj } from '../engine/guards';
const recordTypeName = (keyTypeName, valueTypeName) => `Record<${keyTypeName}, ${valueTypeName}>`;
const checkFields = (keyCaster, valueCaster) => (value, context, reportError) => Object.entries(value).reduce((obj, [key, val]) => {
const newKey = keyCaster(key, context ? `key of ${context}` : 'key', reportError);
const newValue = valueCaster(val, context ? `${context}.${key}` : key, reportError);
obj[newKey] = newValue;
return obj;
}, Object.create(null));
export const record = (keyCaster, valueCaster, typeName = recordTypeName(keyCaster.name, valueCaster.name)) => createCaster(typeName, isAnObj, checkFields(keyCaster, valueCaster));