Typescript で React ref を可変インスタンスとして使用するにはどうすればよいですか? 現在のプロパティは読み取り専用として型指定されているようです。
私は React + Typescript を使用して、React によってレンダリングされない入力フィールドとやり取りするライブラリを開発しています。HTML 要素への参照をキャプチャし、それに React イベントをバインドしたいと考えています。
const inputRef = useRef<HTMLInputElement>();
const { elementId, handler } = props;
// Bind change handler on mount/ unmount
useEffect(() => {
inputRef.current = document.getElementById(elementId);
if (inputRef.current === null) {
throw new Exception(`Input with ID attribute ${elementId} not found`);
}
handler(inputRef.current.value);
const callback = debounce((e) => {
eventHandler(e, handler);
}, 200);
inputRef.current.addEventListener('keypress', callback, true);
return () => {
inputRef.current.removeEventListener('keypress', callback, true);
};
});
コンパイラ エラーが生成されます。semantic error TS2540: Cannot assign to 'current' because it is a read-only property.
私もconst inputRef = useRef<{ current: HTMLInputElement }>();
これを試しましたが、次のコンパイラエラーが発生しました:
Type 'HTMLElement | null' is not assignable to type '{ current: HTMLInputElement; } | undefined'.
Type 'null' is not assignable to type '{ current: HTMLInputElement; } | undefined'.
ベストアンサー1
はい、これは型付けの書き方の癖です:
function useRef<T>(initialValue: T): MutableRefObject<T>;
function useRef<T>(initialValue: T | null): RefObject<T>;
initialValue
と型パラメータの型がT
一致する場合、最初のオーバーライドにヒットし、 が取得されますMutableRefObject<T>
。initialValue
includenull
と type パラメータの型T
が一致しない場合は、2 番目のオーバーライドにヒットし、不変になりますRefObject<T>
。
これを行うと、2 番目のケースに該当します。
useRef<HTMLInputElement>(null)
T
HTMLInputElement
は次のように指定され、タイプのnull
は と推論されますHTMLInputElement | null
。
最初のケースは次のように実行することで解決できます。
useRef<HTMLInputElement | null>(null)
T
HTMLInputElement | null
は次のように指定され、タイプのnull
は と推論されますHTMLInputElement | null
。