`style` prop type error
If I just try to pass text area attributes (from React.InputHTMLAttributes) to TextareaAutosize there is a type error that height property of style does not match.
type Props = React.InputHTMLAttributes<HTMLTextAreaElement>;
const Component: React.FC<Props> = props => <TextareaAutosize {...props} />;
Here is the full error:
Type '{ accept?: string | undefined; alt?: string | undefined; autoComplete?: string | undefined; autoFocus?: boolean | undefined; capture?: string | boolean | undefined; checked?: boolean | undefined; ... 279 more ...; css?: InterpolationWithTheme<...>; }' is not assignable to type 'Pick<TextareaAutosizeProps, "style" | "autoComplete" | "autoFocus" | "disabled" | "form" | "maxLength" | "minLength" | "name" | "placeholder" | "readOnly" | ... 262 more ... | "wrap">'.
Types of property 'style' are incompatible.
Type 'CSSProperties | undefined' is not assignable to type '(CSSProperties & Pick<CSSProperties, "height" | "width" | "translate" | "color"
| "clipPath" | "filter" | "marker" | "mask" | "alignContent" | ... 753 more ... | "vectorEffect"> & { ...; }) | undefined'.
Type 'CSSProperties' is not assignable to type 'CSSProperties & Pick<CSSProperties, "height" | "width" | "translate" | "color" | "clipPath" | "filter" | "marker" | "mask" | "alignContent" | ... 753 more ... | "vectorEffect"> & { ...; }'.
Type 'CSSProperties' is not assignable to type '{ height?: number | undefined; }'.
Types of property 'height' are incompatible.
Type 'string | number | undefined' is not assignable to type 'number | undefined'.
Type 'string' is not assignable to type 'number | undefined'. TS2322
I don't feel like I should be getting an error there.
Why would you like to use props.style.height? This is being controlled by the react-textarea-autosize because it's the only way to implement "autosizing". I don't believe that you should ever pass this to this component, apart from providing an initial value when SSRing.
I don't want to use it but when I pass textarea props to my wrapping components I get errors. Shouldn't then the better solution be to omit heigth prop as well and also export the props type so typescript users that make wrapping components can just use the exported type for passing down the props? I'll make those changes to my PR.
If I use the TextareaAutosizeProps instead of React.InputHTMLAttributes<HTMLTextAreaElement> I get error on ref attribute not matching. Here is full error:
Type '{ css: (theme: { colors: { primary: string; primaryLight: string; secondary: string; text: string; textLight: string; error: string; success: string; warning: string; lightGrey: string; darkerGrey: string; lightGreen: string; darkGreen: string; }; breakpoints: string[]; fontSizes: number[]; space: number[]; }) => Se...' is not assignable to type 'RefAttributes<HTMLTextAreaElement>'.
Types of property 'ref' are incompatible.
Type 'string | ((instance: HTMLTextAreaElement | null) => void) | RefObject<HTMLTextAreaElement> | null | undefined' is not assignable to type '((instance: HTMLTextAreaElement | null) => void) | RefObject<HTMLTextAreaElement> | null | undefined'.
Type 'string' is not assignable to type '((instance: HTMLTextAreaElement | null) => void) | RefObject<HTMLTextAreaElement> | null | undefined'. TS2322
With React.InputHTMLAttributes<HTMLTextAreaElement> the error isn`t there.
Could you prepare a repro case on which I could take a loot at?
https://codesandbox.io/s/react-typescript-playground-ebgce?file=/src/index.tsx
Here are all three examples of just making a wrapper component that passes it's props down to TextareaAutosize component.
Just a note - I've recognized a problem on CodeSandbox using your provided repro https://github.com/codesandbox/codesandbox-client/issues/4307
I've also checked that those 2 are not the same:
type Ref1 = React.ComponentProps<typeof TextareaAutosize>["ref"]
type Ref2 = TextareaAutosizeProps["ref"]
I guess I need to export TextareaAutosizeProps differently (using the Ref1 approach), because when I've experimented with it that has caused this to work.
Actually - I have gone in a slightly different direction. You can take a look at https://github.com/Andarist/react-textarea-autosize/commit/db872f035e8c033eb96c40eead9c041ec6b2e09f . I will probably release this over the weekend.
I'm not exactly sure why JSX.IntrinsicElements['textarea'] and React.TextareaHTMLAttributes<HTMLTextAreaElement> use different ref types and quick google search did not return any answer on what is the exact difference between the two. I've chosen same approach as you in my code, just omitting ref because I'm not using it anyways.
I'm not exactly sure why JSX.IntrinsicElements['textarea'] and React.TextareaHTMLAttributes<HTMLTextAreaElement> use different ref types
I don't think this is a problem. The problem is that I've declared our props to use JSX.IntrinsicElements['textarea'] which allows for all kind of refs (ref object, function, legacy string), but TextareaAutosize is using React.forwardRef which is not allowing legacy string refs and thus you couldn't just spread TextareaAutosizeProps onto it.
But as ref never really appears as part of the props (it is received as a second argument within React.forwardRef) the solution was to just omit it from there.
Can't you then just use the React.TextareaHTMLAttributes<HTMLTextAreaElement>?
Yes, I can. Thanks for the tip - this is even better. It seems that I have been using JSX.IntrinsicElements incorrectly all this time. TIL.
I've just prepared a change for this: https://github.com/Andarist/react-textarea-autosize/commit/61ca826a3fbe33abb9c67885d5bbd7b34ecd66db