Skip to content

Commit a240bcc

Browse files
authored
feat: allow passing specific item type to virtual list types (#2137)
1 parent 2a6d5ee commit a240bcc

File tree

2 files changed

+29
-21
lines changed

2 files changed

+29
-21
lines changed

packages/vaadin-virtual-list/src/vaadin-virtual-list.d.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mix
22

33
import { ElementMixin } from '@vaadin/vaadin-element-mixin/vaadin-element-mixin.js';
44

5-
export type VirtualListItem = unknown;
5+
export type VirtualListDefaultItem = any;
66

7-
export interface VirtualListItemModel {
7+
export interface VirtualListItemModel<TItem> {
88
index: number;
9-
item: VirtualListItem;
9+
item: TItem;
1010
}
1111

12-
export type VirtualListRenderer = (
12+
export type VirtualListRenderer<TItem> = (
1313
root: HTMLElement,
14-
virtualList: VirtualListElement,
15-
model: VirtualListItemModel
14+
virtualList: VirtualListElement<TItem>,
15+
model: VirtualListItemModel<TItem>
1616
) => void;
1717

1818
/**
@@ -36,7 +36,7 @@ export type VirtualListRenderer = (
3636
* @mixes ElementMixin
3737
* @mixes ThemableMixin
3838
*/
39-
declare class VirtualListElement extends ElementMixin(ThemableMixin(HTMLElement)) {
39+
declare class VirtualListElement<TItem = VirtualListDefaultItem> extends ElementMixin(ThemableMixin(HTMLElement)) {
4040
/**
4141
* Custom function for rendering the content of every item.
4242
* Receives three arguments:
@@ -48,12 +48,12 @@ declare class VirtualListElement extends ElementMixin(ThemableMixin(HTMLElement)
4848
* - `model.index` The index of the rendered item.
4949
* - `model.item` The item.
5050
*/
51-
renderer: VirtualListRenderer | undefined;
51+
renderer: VirtualListRenderer<TItem> | undefined;
5252

5353
/**
5454
* An array containing items determining how many instances to render.
5555
*/
56-
items: Array<VirtualListItem> | undefined;
56+
items: Array<TItem> | undefined;
5757

5858
/**
5959
* Scroll to a specific index in the virtual list.

packages/vaadin-virtual-list/test/typings/virtual-list.types.ts

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,36 @@
11
import '../../vaadin-virtual-list.js';
22

3-
import {
4-
VirtualListElement,
5-
VirtualListItem,
6-
VirtualListItemModel,
7-
VirtualListRenderer
8-
} from '../../vaadin-virtual-list.js';
3+
import { VirtualListElement, VirtualListItemModel, VirtualListRenderer } from '../../vaadin-virtual-list.js';
94

105
const assertType = <TExpected>(actual: TExpected) => actual;
116

12-
const virtualList = document.createElement('vaadin-virtual-list');
7+
const genericVirtualList = document.createElement('vaadin-virtual-list');
138

14-
assertType<VirtualListElement>(virtualList);
9+
assertType<VirtualListElement>(genericVirtualList);
1510

16-
assertType<VirtualListItem>(1);
17-
virtualList.items = [1, 2, 3];
11+
genericVirtualList.items = [1, 2, 3];
12+
13+
interface TestVirtualListItem {
14+
testProperty: string;
15+
}
16+
17+
const virtualList = genericVirtualList as VirtualListElement<TestVirtualListItem>;
18+
19+
assertType<VirtualListElement<TestVirtualListItem>>(virtualList);
20+
21+
virtualList.items = [{ testProperty: '1' }, { testProperty: '2' }, { testProperty: '3' }];
22+
23+
assertType<Array<TestVirtualListItem>>(virtualList.items);
1824

1925
virtualList.renderer = (root, virtualList, model) => {
2026
assertType<HTMLElement>(root);
2127
assertType<VirtualListElement>(virtualList);
22-
assertType<VirtualListItemModel>(model);
28+
assertType<VirtualListItemModel<TestVirtualListItem>>(model);
29+
assertType<number>(model.index);
30+
assertType<TestVirtualListItem>(model.item);
2331
};
2432

25-
assertType<VirtualListRenderer>(virtualList.renderer);
33+
assertType<VirtualListRenderer<TestVirtualListItem>>(virtualList.renderer);
2634

2735
assertType<void>(virtualList.scrollToIndex(3));
2836

0 commit comments

Comments
 (0)