I am trying to type a Component prop that could accept both:
const MyInput = RN.TextInput
As well as something more custom:
const MyInput = React.forwardRef<RN.TextInput, RN.TextInputProps>(textProps: RN.TextInputProps) => <RN.View> <RN.TextInput {...props} /> </RN.View>
So, I tried:
const MyComp = (props: { MyInput: React.ComponentType<RN.TextInputProps> }) => ...
But when trying to set a ref, I get:
const MyComp = ({ MyInput }) => { const ref = React.useRef<InputText>() return <MyInput ref={ref} } /* Type '{ ref: RefObject<TextInput>; style: { height: number; fontSize: number; lineHeight: number; }; selectTextOnFocus: true; value: string; onChangeText: (text: string) => void; multiline: true; onKeyPress: (e: NativeSyntheticEvent<...>) => void; onSubmitEditing: () => void; onCancelEditing: () => void; }' is not assignable to type 'IntrinsicAttributes & TextInputProps & { children?: ReactNode; }'. Property 'ref' does not exist on type 'IntrinsicAttributes & TextInputProps & { children?: ReactNode; }'.ts(2322) */
Then I tried:
const MyComp = (props: { MyInput: React.ForwardRefExoticComponent< RN.TextInputProps & React.RefAttributes<RN.TextInput> > }) => ...
But in this case, when trying to pass RN.TextInput
as prop, I get:
<MyComp MyInput={RN.TextInput} /> /* Property '$$typeof' is missing in type 'typeof TextInput' but required in type 'ForwardRefExoticComponent<TextInputProps & RefAttributes<TextInput>>'.ts(2741) */
Here is a sandbox showing the issue
Advertisement
Answer
Adding typeof TextInput
solve the TS error for me
const MyComp = (props: { MyInput: React.ForwardRefExoticComponent< RN.TextInputProps & React.RefAttributes<RN.TextInput> > | typeof TextInput }) => ...
I think you don’t even need the exotic type because TextInput itself already is capable of receiving a ref
const MyComp = (props: { MyInput: typeof TextInput }) => ...