【发布时间】:2021-04-27 10:16:29
【问题描述】:
我对 Typescript 还是有点陌生,我的目标是在 Typescript 中创建一个自定义的 React.useRef 钩子,它返回一个引用。我希望为任何 HTML 元素输入此引用,而不仅仅是按钮。我遇到了正确键入此自定义挂钩的问题。
这是我的钩子:
type CustomRefHook = (dependencies?: string | boolean | number[]) => React.MutableRefObject<HTMLButtonElement | null>;
const useCustomRefHook: CustomRefHook = (...dependencies) => {
const ref = React.useRef<HTMLButtonElement | null>(null);
useEffect(() => {
// ... do stuff
}, dependencies)
return ref;
}
目前,这个钩子的大部分用例都是用于按钮,但我希望最终将它扩展到任何类型的 HTML 元素。我试过使用 HTMLElement 而不是 HTMLButtonElement ,但是我得到一个类型错误:
Type 'MutableRefObject<HTMLElement | null>' is not assignable to type 'string | ((instance: HTMLButtonElement | null) => void) | RefObject<HTMLButtonElement> | null | undefined'.
Type 'MutableRefObject<HTMLElement | null>' is not assignable to type 'RefObject<HTMLButtonElement>'.
Types of property 'current' are incompatible.
Type 'HTMLElement | null' is not assignable to type 'HTMLButtonElement | null'.
每当我尝试将此引用附加到按钮时。使用 HTMLButtonElement 可以消除 Typescript 错误,但我希望这个钩子能够处理任何类型的 HTML 元素。
【问题讨论】:
-
您需要为元素类型使用泛型。
-
那会是什么样子?我试过类似:
type CustomRefHook = <T>(dependencies?: string | boolean | number[]) => React.MutableRefObject<T>; -
是的,基本上就是这样。我会输入一个答案。
标签: html reactjs typescript ref