@@ -851,6 +851,14 @@ let inline fn<'P> (f: 'P -> ReactElement) (props: 'P) (children: ReactElement se
851851let inline ofImport < 'P > ( importMember : string ) ( importPath : string ) ( props : 'P ) ( children : ReactElement seq ): ReactElement =
852852 createElement( import importMember importPath, props, children)
853853
854+ [<Erase>]
855+ type ReactElementType < 'props > = interface end
856+
857+ [<Erase>]
858+ type ReactComponentType < 'props > =
859+ inherit ReactElementType< 'props>
860+ abstract displayName: string option with get, set
861+
854862#if FABLE_ COMPILER
855863/// Alias of `ofString`
856864let inline str ( s : string ): ReactElement = unbox s
@@ -878,6 +886,40 @@ let inline ofList (els: ReactElement list): ReactElement = unbox(List.toArray el
878886/// Returns an array **from .render() method**
879887let inline ofArray ( els : ReactElement array ): ReactElement = unbox els
880888
889+ [<RequireQualifiedAccess>]
890+ module ReactElementType =
891+ let inline ofComponent < 'comp , 'props , 'state when 'comp :> Component < 'props , 'state >> : ReactComponentType < 'props > =
892+ unbox jsConstructor< 'comp>
893+
894+ let inline ofFunction < 'props > ( f : 'props -> ReactElement ) : ReactComponentType < 'props > =
895+ unbox f
896+
897+ let inline ofHtmlElement < 'props > ( name : string ): ReactElementType < 'props > =
898+ unbox name
899+
900+ /// Create a ReactElement to be rendered from an element type, props and children
901+ let inline create < 'props > ( comp : ReactElementType < 'props >) ( props : 'props ) ( children : ReactElement seq ): ReactElement =
902+ createElement( comp, props, children)
903+
904+ type PropsEqualityComparison < 'props > = 'props -> 'props -> bool
905+
906+ /// React.memo is a higher order component. It’s similar to React.PureComponent but for function components instead of
907+ /// classes.
908+ ///
909+ /// If your function component renders the same result given the same props, you can wrap it in a call to React.memo
910+ /// for a performance boost in some cases by memoizing the result. This means that React will skip rendering the
911+ /// component, and reuse the last rendered result.
912+ ///
913+ /// By default it will only shallowly compare complex objects in the props object. If you want control over the
914+ /// comparison, you can also provide a custom comparison function as the second argument.
915+ [<Import( " memo" , from= " react" ) >]
916+ let memo < 'props > ( render : 'props -> ReactElement , areEqual : PropsEqualityComparison < 'props > option ) : ReactComponentType < 'props > =
917+ jsNative
918+
919+ /// Create a ReactElement to be rendered from an element type, props and children
920+ let inline ofElementType < 'props > ( comp : ReactElementType < 'props >) ( props : 'props ) ( children : ReactElement seq ): ReactElement =
921+ ReactElementType.create comp props children
922+
881923#else
882924/// Alias of `ofString`
883925let inline str ( s : string ): ReactElement = HTMLNode.Text s :> ReactElement
0 commit comments