Skip to content

Using mutable ref in Button rises type error #1259

Open
@dagatsoin

Description

@dagatsoin

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} />
})

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions