code: function createShapeChecker(shapeTypes) {
  
      return createChainableChecker(function (data, dataName, componentName, fullDataName) {
  
          if (getDataType(shapeTypes) !== 'object') {
              throw new Error('[SAN ERROR] '
                  + 'Data `' + fullDataName + '` of `' + componentName + '` has invalid '
                  + 'DataType notation inside `shape`, expected `object`'
              );
          }
  
          var dataValue = data[dataName];
          var dataType = getDataType(dataValue);
  
          if (dataType !== 'object') {
              throw new Error('[SAN ERROR] '
                  + 'Invalid ' + componentName + ' data `' + fullDataName + '` of type'
                  + '(' + dataType + ' supplied to ' + componentName + ', '
                  + 'expected object)'
              );
          }
  
          for (var shapeKeyName in shapeTypes) {
              /* istanbul ignore else  */
              if (shapeTypes.hasOwnProperty(shapeKeyName)) {
                  var checker = shapeTypes[shapeKeyName];
                  if (typeof checker === 'function') {
                      checker(dataValue, shapeKeyName, componentName, fullDataName + '.' + shapeKeyName);
                  }
              }
          }
  
      });
  
  }
docs: 生成 shape 校验器
  
  @param  {Object} shapeTypes shape 校验规则
  @return {Function}