1. export default function forwardRef<Props, ElementType: React$ElementType>(
    2. render: (props: Props, ref: React$Ref<ElementType>) => React$Node,
    3. ) {
    4. // 开发环境校验报错
    5. if (__DEV__) {
    6. // 如果封装的不是函数,则抛出错误
    7. if (typeof render !== 'function') {
    8. warningWithoutStack(
    9. false,
    10. 'forwardRef requires a render function but was given %s.',
    11. render === null ? 'null' : typeof render,
    12. );
    13. } else {
    14. // 如果对应组件的入参只有一个或者超出两个则抛出错误,正常 forwardRef 的组件应该有两个入参 (props, ref)
    15. warningWithoutStack(
    16. // Do not warn for 0 arguments because it could be due to usage of the 'arguments' object
    17. // 如果没有入参可能是内部使用了 arguments 来获取入参,所以不抛出错误
    18. render.length === 0 || render.length === 2,
    19. 'forwardRef render functions accept exactly two parameters: props and ref. %s',
    20. render.length === 1
    21. ? 'Did you forget to use the ref parameter?'
    22. : 'Any additional parameter will be undefined.',
    23. );
    24. }
    25. if (render != null) {
    26. // 由于 forwardRef 不支持类组件所以如果发现对应情况,则抛出错误
    27. warningWithoutStack(
    28. render.defaultProps == null && render.propTypes == null,
    29. 'forwardRef render functions do not support propTypes or defaultProps. ' +
    30. 'Did you accidentally pass a React component?',
    31. );
    32. }
    33. }
    34. // 返回一个 React Forward Ref Type 类型的 React 元素
    35. return {
    36. $$typeof: REACT_FORWARD_REF_TYPE,
    37. render,
    38. };
    39. }