/**
 * @flow
 * 此注解如果赋值的时候匹配到的类型有问题，会在控制台显示警告
 * @param type CheckType 中定义的类型
 * @returns {Function}
 * @constructor
 */
import React, { Component, Fragment } from 'react';

/**
 * 这里是真正的 decorator
 * @target 装饰的属性所述的类的原型，注意，不是实例后的类。如果装饰的是 Car 的某个属性，这个 target 的值就是 Car.prototype
 * @name 装饰的属性的 key
 * @descriptor 装饰的对象的描述对象
 */
// function d(target, name, descriptor){
//  // 以此可以获取实例化的时候此属性的默认值
//  let v = descriptor.initializer && descriptor.initializer.call(this);
//  // 返回一个新的描述对象，或者直接修改 descriptor 也可以
//  return {
//    enumerable: true,
//    configurable: true,
//    get: function() {
//      return v;
//    },
//    set: function(c) {
//      v = c;
//    }
//  }
//}


function decorator(Comp) {
  if(typeof Comp === 'function'){
    console.log('isFunction')
    return Comp;
  }
  class WrapComp extends Component {
    componentDidMount() : void {
      console.log('WrapComp_name', Comp.name);
      console.log('WrapComp_componentDidMount', Comp);
    }

    render() {
      return (
        <Fragment>
          <Comp {...this.props} />
        </Fragment>
      );
    }
  }
  return (WrapComp);
}

export default decorator;
