从 React 的 中汲取灵感,我为最常见的类型PropTypes创建了一些类型检查函数。
const bool = v => typeof v === ‘boolean’;
const num = v => typeof v === ‘number’ && v === v;
const str = v => typeof v === ‘string’;
const date = v => v instanceof Date;
下一步是决定如何定义物体的形状。事实证明这是一项简单的任务,因为我可以简单地使用类型检查函数的名称作为对象键的值。
const shape = { name: ‘str’, age: ‘num’, active: ‘bool’, birthday: ‘date’ };
决定了如何定义形状后,我需要将这个形状定义转换成一个函数,该函数接受一个对象并用Proxy. Proxy反过来,它会拦截任何设置属性的尝试,并检查设置的值是否属于正确的类型。如果是,则该值按预期设置。如果没有,陷阱返回false,这意味着操作不成功。同样,不应设置不在形状定义中的属性,因此false这些陷阱也会返回。
const createShapeCheckerProxy = (types, shape) => {
const validProps = Object.keys(shape);
const handler = {
set(target, prop, value) {
if (!validProps.includes(prop)) return false;