Ask questionsTypeScript compiler error with ref passed from getInputProps to component using a forwardRef
<!-- Thanks for your interest in the project. I appreciate bugs filed and PRs submitted! Please make sure that you are familiar with and follow the Code of Conduct for this project (found in the CODE_OF_CONDUCT.md file).
Please fill out this template with all the relevant information so we can understand what's going on and fix the issue.
I'll probably ask you to submit the fix (after giving some direction). If you've never done that before, that's great! Check this free short video tutorial to learn how: http://kcd.im/pull-request -->
downshift version: 3.2.10node version: v11.15.0npm (or yarn) version: 6.7.0react version: 16.8.4styled-components version: 4.3.1Relevant code or config
import * as React from "react";
import { render } from "react-dom";
import styled from "styled-components";
import Downshift from "downshift";
const Input = styled.input`
width: 200px;
`;
function App() {
return (
<Downshift>
{({ getInputProps }) => (
<div>
<Input
{...getInputProps({
onKeyUp(e: React.KeyboardEvent<HTMLInputElement>) {
// handle key up
}
})}
/>
</div>
)}
</Downshift>
);
}
const rootElement = document.getElementById("root");
render(<App />, rootElement);
What you did: Attempted to pass a custom getInputProps to a component which implements a forward ref (in this case, to an <input> element).
What happened: A compiler error from TypeScript:
Type '{ onKeyUp: ((e: KeyboardEvent<HTMLInputElement>) => void) & ((event: KeyboardEvent<HTMLInputElement>) => void); disabled?: boolean; accept?: string; acceptCharset?: string; action?: string; ... 354 more ...; key?: Key; }' is not assignable to type 'Pick<Pick<Pick<DetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "form" | "style" | "title" | "pattern" | "onChange" | "onSelect" | "children" | ... 277 more ... | "onTransitionEndCapture"> & { ...; }, "form" | ... 284 more ... | "onTransitionEndCapture"> & Partial<...>, "form" | ... 284 mo...'.
Types of property 'ref' are incompatible.
Type 'LegacyRef<HTMLInputElement>' is not assignable to type '((instance: HTMLInputElement) => void) | RefObject<HTMLInputElement>'.
Type 'string' is not assignable to type '((instance: HTMLInputElement) => void) | RefObject<HTMLInputElement>'.ts(2322)
<!-- Please provide the full error message/screenshots/anything -->
Reproduction repository: https://codesandbox.io/s/loving-diffie-njech
Problem description: Type of ref is incompatible, even though the component appears to behave correctly with the forwarded ref.
Suggested solution: Change the type definitions to (optionally?) remove the LegacyRef part.
Answer
questions
silviuaavram
I looked into the codesandbox but I don't see any error with ref. Instead I see one with the <Input> you are using, that it does no accept onKeyUp (or onKeyDown for instance). If you cast it to any const Input: any then it works for me.
Try to fix it at your end or change the codesandbox with the relevant error. Thank you!
Related questions