Skip to content

Instantly share code, notes, and snippets.

@MarekZeman91
Created May 27, 2022 21:25
Show Gist options
  • Save MarekZeman91/04619e2700f6361ad3c9d469a1be3100 to your computer and use it in GitHub Desktop.
Save MarekZeman91/04619e2700f6361ad3c9d469a1be3100 to your computer and use it in GitHub Desktop.
How to forward custom ref
import { createRef, ForwardedRef, forwardRef, useImperativeHandle, useRef } from 'react';
interface ForwardedHandlers<T> {
getValue(): T;
}
interface ForwardedProps<T> {
value: T;
children?: never;
}
const ForwardedFn = <T extends string>(
props: ForwardedProps<T>,
ref: ForwardedRef<ForwardedHandlers<T>>
) => {
const inputRef = useRef<HTMLInputElement>();
useImperativeHandle(ref, () => ({
getValue: () => inputRef.current?.value as T,
}));
return <input defaultValue={ props.value } ref={ inputRef }/>;
};
export const Forwarded = forwardRef(ForwardedFn) as <T extends any>(
props: ForwardedProps<T> & { ref?: ForwardedRef<ForwardedHandlers<T>> }
) => ReturnType<typeof ForwardedFn>;
const ref = createRef<ForwardedHandlers<string>>();
const cmp = <Forwarded<string> value="Lorem ipsum"/>;
const value = ref.current.getValue();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment