21764: Add more type safety to TreePicker
authorStephen Smith <stephen@curii.com>
Fri, 28 Jun 2024 15:21:01 +0000 (11:21 -0400)
committerStephen Smith <stephen@curii.com>
Fri, 28 Jun 2024 15:23:46 +0000 (11:23 -0400)
Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen@curii.com>

services/workbench2/src/views-components/tree-picker/tree-picker.ts

index 3bd1aee7a8b8c0de22253a9b154f425c00580cc2..6ea8c56b184ad93edfdf86401ee778b9d2e19f93 100644 (file)
@@ -20,18 +20,18 @@ export interface TreePickerProps<T> {
     toggleItemSelection: Callback<T>;
 }
 
-const flatTree = (itemsIdMap: Map<string, any>, depth: number, items?: any): [] => {
+const flatTree = <T>(itemsIdMap: Map<string, TreeItem<T>>, depth: number, items?: TreeItem<T>[]): TreeItem<T>[] => {
     return items ? items
-        .map((item: any) => addToItemsIdMap(item, itemsIdMap))
-        .reduce((prev: Array<any>, next: any) => {
+        .map((item: TreeItem<T>) => addToItemsIdMap(item, itemsIdMap))
+        .reduce((acc: Array<TreeItem<T>>, next: TreeItem<T>) => {
             const { items } = next;
-            prev.push({ ...next, depth });
-            prev.push(...(next.open ? flatTree(itemsIdMap, depth + 1, items) : []));
-            return prev;
-        }, []) : [];
+            acc.push({ ...next, depth });
+            acc.push(...(next.open ? flatTree(itemsIdMap, depth + 1, items) : []));
+            return acc;
+        }, [] as TreeItem<T>[]) : [];
 };
 
-const addToItemsIdMap = <T>(item: TreeItem<T>, itemsIdMap: Map<string, TreeItem<T>>) => {
+const addToItemsIdMap = <T>(item: TreeItem<T>, itemsIdMap: Map<string, TreeItem<T>>): TreeItem<T> => {
     itemsIdMap[item.id] = item;
     return item;
 };
@@ -39,7 +39,7 @@ const addToItemsIdMap = <T>(item: TreeItem<T>, itemsIdMap: Map<string, TreeItem<
 const mapStateToProps =
     <T>(state: RootState, props: TreePickerProps<T>): Pick<TreeProps<T>, 'items' | 'disableRipple' | 'itemsMap'> => {
         const itemsIdMap: Map<string, TreeItem<T>> = new Map();
-        const tree = state.treePicker[props.pickerId] || createTree();
+        const tree: Tree<T> = state.treePicker[props.pickerId] || createTree<T>();
         return {
             disableRipple: true,
             items: getNodeChildrenIds('')(tree)
@@ -54,7 +54,7 @@ const mapStateToProps =
         };
     };
 
-const mapDispatchToProps = (_: Dispatch, props: TreePickerProps<any>): Pick<TreeProps<any>, 'onContextMenu' | 'toggleItemOpen' | 'toggleItemActive' | 'toggleItemSelection'> => ({
+const mapDispatchToProps = <T>(_: Dispatch, props: TreePickerProps<T>): Pick<TreeProps<T>, 'onContextMenu' | 'toggleItemOpen' | 'toggleItemActive' | 'toggleItemSelection'> => ({
     onContextMenu: (event, item) => props.onContextMenu(event, item, props.pickerId),
     toggleItemActive: (event, item) => props.toggleItemActive(event, item, props.pickerId),
     toggleItemOpen: (event, item) => props.toggleItemOpen(event, item, props.pickerId),