Open
Description
Current behavior:
Passing a MutableRef to a Button rises an error.
const MyComp = function(props: ButtonProps) {
const ref= React.useRef<Button>()
return <Button ref={ref}/>
}
Error received
ERROR in [at-loader] ./stories/button/story.common.tsx:8:18
TS2769: No overload matches this call.
Overload 1 of 2, '(props: ButtonProps | Readonly<ButtonProps>): Button', gave the following error.
Type 'MutableRefObject<Button | undefined>' is not assignable to type '(string & ((instance: Button | null) => void)) | (string & RefObject<Button>) | (((instance: Button | null) => void) & ((instance: Button | null) => void)) | ... 4 more ... | undefined'.
Type 'MutableRefObject<Button | undefined>' is not assignable to type 'React.RefObject<Button> & RefObject<Button>'.
Type 'MutableRefObject<Button | undefined>' is not assignable to type 'RefObject<Button>'.
Types of property 'current' are incompatible.
Type 'Button | undefined' is not assignable to type 'Button | null'.
Type 'undefined' is not assignable to type 'Button | null'.
Overload 2 of 2, '(props: ButtonProps, context: any): Button', gave the following error.
Type 'MutableRefObject<Button | undefined>' is not assignable to type '(string & ((instance: Button | null) => void)) | (string & RefObject<Button>) | (((instance: Button | null) => void) & ((instance: Button | null) => void)) | ... 4 more ... | undefined'.
Type 'MutableRefObject<Button | undefined>' is not assignable to type 'React.RefObject<Button> & RefObject<Button>'.
Type 'MutableRefObject<Button | undefined>' is not assignable to type 'RefObject<Button>'.
ERROR in [at-loader] ./stories/button/story.common.tsx:235:15
TS2322: Type '{ root: Types.StyleRuleSet<Types.ViewStyle>[]; content: { borderRadius: number; }; label: { color: string; }; icon: { color: string; }; }' is not assignable to type 'StyleRuleSetRecursive<StyleRuleSet<ButtonStyle>>'.
Object literal may only specify known properties, and 'root' does not exist in type 'ButtonStyle | StyleRuleSetRecursiveArray<StyleRuleSet<ButtonStyle>>'.
Impact
1- Can't use the React.useRef hook
2- Can't use React.forwardRef
Workaround
Wrap the component and use a callback to transform the mutable ref in a callback.
const Button = React.forwardRef(function(props: Types.ButtonProps, ref) {
const setRef = typeof ref === "object"
? React.useCallback(function(nativeRef: RXButton) {
if (ref) {
ref.current = nativeRef
}
}, [])
: ref
return <RXButton {...props} ref={setRef} />
})