@@ -33,11 +33,16 @@ export interface CollectionBuilderProps<C extends BaseCollection<object>> {
3333/**
3434 * Builds a `Collection` from the children provided to the `content` prop, and passes it to the child render prop function.
3535 */
36- export function CollectionBuilder < C extends BaseCollection < object > > ( props : CollectionBuilderProps < C > ) {
36+ export function CollectionBuilder < C extends BaseCollection < object > > ( props : CollectionBuilderProps < C > ) : ReactElement {
3737 // If a document was provided above us, we're already in a hidden tree. Just render the content.
3838 let doc = useContext ( CollectionDocumentContext ) ;
3939 if ( doc ) {
40- return props . content ;
40+ // The React types prior to 18 did not allow returning ReactNode from components
41+ // even though the actual implementation since React 16 did.
42+ // We must return ReactElement so that TS does not complain that <CollectionBuilder>
43+ // is not a valid JSX element with React 16 and 17 types.
44+ // https://github.com/DefinitelyTyped/DefinitelyTyped/issues/20544
45+ return props . content as ReactElement ;
4146 }
4247
4348 // Otherwise, render a hidden copy of the children so that we can build the collection before constructing the state.
@@ -151,9 +156,9 @@ function useSSRCollectionNode<T extends Element>(Type: string, props: object, re
151156 return < Type ref = { itemRef } > { children } </ Type > ;
152157}
153158
154- export function createLeafComponent < T extends object , P extends object , E extends Element > ( type : string , render : ( props : P , ref : ForwardedRef < E > ) => ReactNode ) : ( props : P & React . RefAttributes < T > ) => ReactNode | null ;
155- export function createLeafComponent < T extends object , P extends object , E extends Element > ( type : string , render : ( props : P , ref : ForwardedRef < E > , node : Node < T > ) => ReactNode ) : ( props : P & React . RefAttributes < T > ) => ReactNode | null ;
156- export function createLeafComponent < P extends object , E extends Element > ( type : string , render : ( props : P , ref : ForwardedRef < E > , node ?: any ) => ReactNode ) {
159+ export function createLeafComponent < T extends object , P extends object , E extends Element > ( type : string , render : ( props : P , ref : ForwardedRef < E > ) => ReactElement ) : ( props : P & React . RefAttributes < T > ) => ReactElement | null ;
160+ export function createLeafComponent < T extends object , P extends object , E extends Element > ( type : string , render : ( props : P , ref : ForwardedRef < E > , node : Node < T > ) => ReactElement ) : ( props : P & React . RefAttributes < T > ) => ReactElement | null ;
161+ export function createLeafComponent < P extends object , E extends Element > ( type : string , render : ( props : P , ref : ForwardedRef < E > , node ?: any ) => ReactElement ) {
157162 let Component = ( { node} ) => render ( node . props , node . props . ref , node ) ;
158163 let Result = ( forwardRef as forwardRefType ) ( ( props : P , ref : ForwardedRef < E > ) => {
159164 let isShallow = useContext ( ShallowRenderContext ) ;
@@ -171,7 +176,7 @@ export function createLeafComponent<P extends object, E extends Element>(type: s
171176 return Result ;
172177}
173178
174- export function createBranchComponent < T extends object , P extends { children ?: any } , E extends Element > ( type : string , render : ( props : P , ref : ForwardedRef < E > , node : Node < T > ) => ReactNode , useChildren : ( props : P ) => ReactNode = useCollectionChildren ) {
179+ export function createBranchComponent < T extends object , P extends { children ?: any } , E extends Element > ( type : string , render : ( props : P , ref : ForwardedRef < E > , node : Node < T > ) => ReactElement , useChildren : ( props : P ) => ReactNode = useCollectionChildren ) {
175180 let Component = ( { node} ) => render ( node . props , node . props . ref , node ) ;
176181 let Result = ( forwardRef as forwardRefType ) ( ( props : P , ref : ForwardedRef < E > ) => {
177182 let children = useChildren ( props ) ;
0 commit comments