weex-nuke
Version:
基于 Rax 、Weex 的高性能组件体系 ~~
71 lines (64 loc) • 2.44 kB
JavaScript
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;
}
;