I'm having a component which belongs to a UI library, lets call it Input component. When using this library to call Input, there are many types I can called. For example
<Input />
<Input.TextArea />
<Input.Search />
Now I want to write a wrapper to this Input component, so I write like this
type InputWrapperComponent = FC<InputProps> & {
Search: typeof Input.Search;
TextArea: typeof Input.TextArea;
};
const InputWrapper: InputWrapperComponent = (props) => {
// make some minor changes here
}
InputWrapper.Search = Input.Search;
InputWrapper.TextArea = Input.TextArea;
export default InputWrapper;
in index.tsx
export { default as InputWrapper } from './input';
Then I can use them like this:
<InputWrapper />. --> Works
<InputWrapper.TextArea />. --> Works
<InputWrapper.Search />. --> Works
But by doing this, I cannot use ref methods of the original UI library ( something like inputRef.current.focus()
). that's why I use forwardRef and ForwardRefRenderFunction like this
type InputWrapperComponent = ForwardRefRenderFunction<HTMLInputElement, InputProps> & {
Search: typeof Input.Search;
TextArea: typeof Input.TextArea;
};
const InputWrapper: InputWrapperComponent = (props, ref) => {
// make some minor changes here and add the ref to the input
}
InputWrapper.Search = Input.Search;
InputWrapper.TextArea = Input.TextArea;
export default forwardRef(InputWrapper);
By changing to this, I can pass the ref to the original UI library and can use its original methods. However, my problem right now is when I change to forwardRef and ForwardRefRenderFunction, I cannot call TextArea and Search anymore
<InputWrapper />. --> Works
<InputWrapper.TextArea />. --> Error
<InputWrapper.Search />. --> Error
This is the error:
Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
Anyone can give me some guidance on this? Thanks