[解決済み] useRef()フックで電流を手動で設定する場合、どのようなtypescriptタイプを使用すればよいですか?
2022-12-14 17:20:01
質問
React の ref を mutable なインスタンスとして、Typescript で使用するにはどうしたらよいでしょうか。現在のプロパティは読み取り専用として型付けされているように見えます。
私は 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'.
どのように解決するのですか?
そう、これはタイピングの書き方のクセなんだ。
function useRef<T>(initialValue: T): MutableRefObject<T>;
function useRef<T>(initialValue: T|null): RefObject<T>;
初期値に
null
を含むが、指定された型パラメタがそうでない場合、それは不変の
RefObject
.
を実行すると
useRef<HTMLInputElement>(null)
とすると、そのケースに当たるので
T
は
HTMLInputElement
であり、かつ
null
と推論されます。
HTMLInputElement | null
.
とすることで修正できます。
useRef<HTMLInputElement | null>(null)
次に
T
は
HTMLInputElement | null
であり、これは最初の引数の型にマッチします。したがって、最初のオーバーライドをヒットし、代わりにミュータブルリフレクションを取得します。
関連
-
[解決済み】Typescriptで、! (エクスクラメーションマーク/バン)演算子でメンバを再参照するのは?
-
[解決済み】React 17で動作するEnzymeアダプターはどれですか?
-
[解決済み] Jestの `beforeEach` グローバルは何のためにあるのですか?
-
[解決済み] React - 予想外のトークン、予想外の;
-
[解決済み] react.jsでng-ifに相当するものは何ですか?
-
[解決済み] react.jsで複数のモジュールをエクスポートする
-
[解決済み] Cross-envでyarnの実行時にenv変数が変更されない。
-
[解決済み] react-router-domを使用する際に「Function components cannot be given refs」を回避する方法は?
-
[解決済み] React」は定義される前に使用されていた
-
[解決済み] Typescript によるインターフェース型チェック
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Apolloクライアントでログアウトした後、ストアをリセットする
-
[解決済み] reactでonloadを使うには?
-
[解決済み] リアクトです。<tr>は<td>の子として表示できません。コメント > td > tr を参照してください。
-
[解決済み] Angular 2の*ngForのReactでの同等品
-
[解決済み] react router dom v4でwebpack dev serverを構成する方法は?
-
[解決済み] 'Proptypes'が定義されていない
-
[解決済み] react nativeで関数だらけのヘルパーファイルを作成する方法は?
-
[解決済み] カスタマイズ素材UI チェックした場合としない場合の切り替え
-
[解決済み] validateDOMNesting警告React
-
[解決済み] React Router - バージョン更新後のwithRouterでTypescriptエラーが発生する。