@@ -52,13 +52,17 @@ interface Item {
5252 size : number
5353}
5454
55- export interface VirtualItem extends Item {
56- measureRef : ( el : HTMLElement | null ) => void
55+ export interface VirtualItem < TItemElement > extends Item {
56+ measureRef : ( el : TItemElement | null ) => void
5757}
5858
59- export interface Options < T > {
59+ export interface Options <
60+ TParentRef ,
61+ TItemElement = HTMLElement ,
62+ TOnScrollElement = TParentRef
63+ > {
6064 size : number
61- parentRef : React . RefObject < T >
65+ parentRef : React . RefObject < TParentRef >
6266 estimateSize ?: ( index : number ) => number
6367 overscan ?: number
6468 horizontal ?: boolean
@@ -68,16 +72,20 @@ export interface Options<T> {
6872 ) => void
6973 paddingStart ?: number
7074 paddingEnd ?: number
71- useObserver ?: ( ref : React . RefObject < T > , initialRect ?: Rect ) => Rect
75+ useObserver ?: ( ref : React . RefObject < TParentRef > , initialRect ?: Rect ) => Rect
7276 initialRect ?: Rect
7377 keyExtractor ?: ( index : number ) => Key
74- onScrollElement ?: React . RefObject < HTMLElement >
78+ onScrollElement ?: React . RefObject < TOnScrollElement >
7579 scrollOffsetFn ?: ( event ?: Event ) => number
7680 rangeExtractor ?: ( range : Range ) => number [ ]
77- measureSize ?: ( el : HTMLElement , horizontal : boolean ) => number
81+ measureSize ?: ( el : TItemElement , horizontal : boolean ) => number
7882}
7983
80- export const useVirtual = < T extends HTMLElement > ( {
84+ export const useVirtual = <
85+ TParentRef extends HTMLElement ,
86+ TItemElement extends HTMLElement = HTMLElement ,
87+ TOnScrollElement extends HTMLElement = TParentRef
88+ > ( {
8189 size = 0 ,
8290 estimateSize = defaultEstimateSize ,
8391 overscan = 1 ,
@@ -93,7 +101,13 @@ export const useVirtual = <T extends HTMLElement>({
93101 keyExtractor = defaultKeyExtractor ,
94102 measureSize = defaultMeasureSize ,
95103 rangeExtractor = defaultRangeExtractor ,
96- } : Options < T > ) => {
104+ } : Options < TParentRef , TItemElement > ) : {
105+ virtualItems : VirtualItem < TItemElement > [ ]
106+ totalSize : number
107+ scrollToOffset : ( offset : number , options ?: ScrollToOffsetOptions ) => void
108+ scrollToIndex : ( index : number , options ?: ScrollToIndexOptions ) => void
109+ measure : ( index : number ) => void
110+ } => {
97111 const sizeKey = horizontal ? 'width' : 'height'
98112 const scrollKey = horizontal ? 'scrollLeft' : 'scrollTop'
99113
@@ -218,7 +232,7 @@ export const useVirtual = <T extends HTMLElement>({
218232 const measureSizeRef = React . useRef ( measureSize )
219233 measureSizeRef . current = measureSize
220234
221- const virtualItems : VirtualItem [ ] = React . useMemo ( ( ) => {
235+ const virtualItems : VirtualItem < TItemElement > [ ] = React . useMemo ( ( ) => {
222236 const virtualItems = [ ]
223237
224238 for ( let k = 0 , len = indexes . length ; k < len ; k ++ ) {
@@ -227,7 +241,7 @@ export const useVirtual = <T extends HTMLElement>({
227241
228242 const item = {
229243 ...measurement ,
230- measureRef : ( el : HTMLElement | null ) => {
244+ measureRef : ( el : TItemElement | null ) => {
231245 if ( el ) {
232246 const measuredSize = measureSizeRef . current ( el , horizontal )
233247
@@ -240,7 +254,7 @@ export const useVirtual = <T extends HTMLElement>({
240254
241255 pendingMeasuredCacheIndexesRef . current . push ( i )
242256
243- setMeasuredCache ( ( old ) => ( {
257+ setMeasuredCache ( old => ( {
244258 ...old ,
245259 [ item . key ] : measuredSize ,
246260 } ) )
0 commit comments