Merge pull request #5703 from xyflow/fix/use-nodes-data-type

Improve return type of useNodesData
This commit is contained in:
Moritz Klack
2026-02-16 20:57:22 +01:00
committed by GitHub
7 changed files with 33 additions and 18 deletions

View File

@@ -1,5 +1,5 @@
import { useCallback } from 'react';
import { shallowNodeData } from '@xyflow/system';
import { DistributivePick, shallowNodeData } from '@xyflow/system';
import { useStore } from '../hooks/useStore';
import type { Node } from '../types';
@@ -25,11 +25,11 @@ import type { Node } from '../types';
export function useNodesData<NodeType extends Node = Node>(
/** The id of the node to get the data from. */
nodeId: string
): Pick<NodeType, 'id' | 'type' | 'data'> | null;
): DistributivePick<NodeType, 'id' | 'type' | 'data'> | null;
export function useNodesData<NodeType extends Node = Node>(
/** The ids of the nodes to get the data from. */
nodeIds: string[]
): Pick<NodeType, 'id' | 'type' | 'data'>[];
): DistributivePick<NodeType, 'id' | 'type' | 'data'>[];
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function useNodesData(nodeIds: any): any {
const nodesData = useStore(

View File

@@ -1,4 +1,4 @@
import { shallowNodeData } from '@xyflow/system';
import { shallowNodeData, type DistributivePick } from '@xyflow/system';
import type { Node } from '$lib/types';
import { useStore } from '$lib/store';
@@ -12,10 +12,10 @@ import { useStore } from '$lib/store';
*/
export function useNodesData<NodeType extends Node = Node>(
nodeId: string
): { current: Pick<NodeType, 'id' | 'data' | 'type'> | null };
): { current: DistributivePick<NodeType, 'id' | 'data' | 'type'> | null };
export function useNodesData<NodeType extends Node = Node>(
nodeIds: string[]
): { current: Pick<NodeType, 'id' | 'data' | 'type'>[] };
): { current: DistributivePick<NodeType, 'id' | 'data' | 'type'>[] };
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function useNodesData(nodeIds: any): any {
const { nodes, nodeLookup } = $derived(useStore());

View File

@@ -56,3 +56,10 @@ export type Transform = [number, number, number];
* to represent an unbounded extent.
*/
export type CoordinateExtent = [[number, number], [number, number]];
/**
* Using Pick with a union type (e.g. `NodeType`) will merge every property type along all union members.
* See https://github.com/microsoft/TypeScript/issues/28339#issuecomment-463577347
* Note: Currently you are able to Pick properties that are not in the type without error.
*/
export type DistributivePick<T, K extends string> = T extends unknown ? { [P in Extract<keyof T, K>]: T[P] } : never;