ButtonProps from the package is incompatible with Button component from the package

别来无恙 提交于 2021-01-29 14:02:21

问题


I'm using Reactstrap with Typescript and typings from @types/reactstrap. I'm trying to use the Button component in an HOC, so I need to explicitly reference the ButtonProps type. Here's the code for it:

import React from 'react'
import {withFormState, FormState} from 'informed'
import {Button, ButtonProps} from 'reactstrap'

export const SubmitButton = withFormState<Button, {formState: FormState} & ButtonProps>(
  ({
    formState: {pristine, invalid},
    disabled = false, children,
    ...props
  }) =>
    <Button type="submit" color="success" 
            disabled={pristine || invalid || disabled}
            {...props}>
      {children}
    </Button>
)

So basically I just combine ButtonProps from the package with FormState from another package, but in the end the props variable should have only the props matching the ButtonProps type (since formState is destructured from it).

However, TS says that ButtonProps do not match the props that I pass to the component, namely that the ref property types are incompatible. I don't work with refs in this instance, so it's unlikely that I messed them up. Most likely, I just do not understand how to properly define types in this case.

Here are the references to the typings that I use:

  • Informed's withFormState type
  • Reactstrap's ButtonProps and Button

回答1:


I'd consider this a bug in the @types/reactstrap type declarations. Notice that the same error occurs in the following simpler test case:

function test(props: ButtonProps) {
    return <Button {...props}/>;
}

ButtonProps includes React.HTMLProps<HTMLButtonElement>, which includes a ref prop of type Ref<HTMLButtonElement>, but Button cannot truly accept such a prop because React will intercept a ref prop specified on the JSX element and associate it with the Button component, not any HTMLButtonElement that may exist within it. ButtonProps should probably be changed to use React.AllHTMLAttributes<HTMLButtonElement> instead of React.HTMLProps<HTMLButtonElement>. Please file an issue against DefinitelyTyped.

As a workaround, you can remove the bogus ref prop in the destructuring:

export const SubmitButton = withFormState<Button, {formState: FormState} & ButtonProps>(
  ({
    formState: {pristine, invalid},
    disabled = false, children,
    ref,  // <---
    ...props
  }) => {
    return <Button type="submit" color="success" 
            disabled={pristine || invalid || disabled}
            {...props}>
      {children}
    </Button>
  }
)


来源:https://stackoverflow.com/questions/52728722/buttonprops-from-the-package-is-incompatible-with-button-component-from-the-pack

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!