diff --git a/packages/react/src/ReactElement.js b/packages/react/src/ReactElement.js index 0594412fa78f..9127453b9b55 100644 --- a/packages/react/src/ReactElement.js +++ b/packages/react/src/ReactElement.js @@ -5,6 +5,7 @@ * LICENSE file in the root directory of this source tree. */ +import invariant from 'fbjs/lib/invariant'; import warning from 'fbjs/lib/warning'; import {REACT_ELEMENT_TYPE} from 'shared/ReactSymbols'; @@ -290,6 +291,12 @@ export function cloneAndReplaceKey(oldElement, newKey) { * See https://reactjs.org/docs/react-api.html#cloneelement */ export function cloneElement(element, config, children) { + invariant( + !(element === null || element === undefined), + 'React.cloneElement(...): The argument must be a React element, but you passed %s.', + element, + ); + let propName; // Original props are copied diff --git a/packages/react/src/__tests__/ReactElementClone-test.js b/packages/react/src/__tests__/ReactElementClone-test.js index d5b08496ba74..475fa623cb22 100644 --- a/packages/react/src/__tests__/ReactElementClone-test.js +++ b/packages/react/src/__tests__/ReactElementClone-test.js @@ -359,4 +359,18 @@ describe('ReactElementClone', () => { } expect(clone.props).toEqual({foo: 'ef'}); }); + + it('throws an error if passed null', () => { + const element = null; + expect(() => React.cloneElement(element)).toThrow( + 'React.cloneElement(...): The argument must be a React element, but you passed null.', + ); + }); + + it('throws an error if passed undefined', () => { + let element; + expect(() => React.cloneElement(element)).toThrow( + 'React.cloneElement(...): The argument must be a React element, but you passed undefined.', + ); + }); });