UNPKG

weex-nuke

Version:

基于 Rax 、Weex 的高性能组件体系 ~~

71 lines (64 loc) 2.44 kB
'use strict'; export default { array: createTypeChecker('array'), bool: createTypeChecker('boolean'), func: createTypeChecker('function'), number: createTypeChecker('number'), object: createTypeChecker('object'), string: createTypeChecker('string'), // TODO any: createTypeChecker(), arrayOf: createTypeChecker(), element: createTypeChecker(), instanceOf: createTypeChecker(), node: createTypeChecker(), objectOf: createTypeChecker(), oneOf: createTypeChecker(), oneOfType: createTypeChecker(), shape: createTypeChecker(), }; // Equivalent of `typeof` but with special handling for array and regexp. function getPropType(propValue) { var propType = typeof propValue; if (Array.isArray(propValue)) { return 'array'; } if (propValue instanceof RegExp) { // Old webkits (at least until Android 4.0) return 'function' rather than // 'object' for typeof a RegExp. We'll normalize this here so that /bla/ // passes PropTypes.object. return 'object'; } return propType; } function createTypeChecker(expectedType) { function validate(props, propName, componentName, location, propFullName) { var propValue = props[propName]; var propType = getPropType(propValue); if (expectedType !== undefined && propType !== expectedType) { // `propValue` being instance of, say, date/regexp, pass the 'object' // check, but we can offer a more precise error message here rather than // 'of type `object`'. return new Error('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.')); } return null; } return createChainableTypeChecker(validate); } function createChainableTypeChecker(validate) { function checkType(isRequired, props, propName, componentName, location, propFullName) { componentName = componentName || ANONYMOUS; propFullName = propFullName || propName; if (props[propName] == null) { if (isRequired) { return new Error('Required ' + location + ' `' + propFullName + '` was not specified in ' + ('`' + componentName + '`.')); } return null; } else { return validate(props, propName, componentName, location, propFullName); } } var chainedCheckType = checkType.bind(null, false); chainedCheckType.isRequired = checkType.bind(null, true); return chainedCheckType; }