import { useQuery } from '@tanstack/react-query'; import type { QueryKey } from '@tanstack/react-query'; import type { z } from 'zod'; import { validateResponse } from '../utils/validate'; interface UseApiQueryOptions { queryKey: QueryKey; queryFn: () => Promise; /** zod schema:响应校验失败会抛出带字段路径的错误,由统一错误处理展示 */ schema: z.ZodType; enabled?: boolean; staleTime?: number; /** 可选的数据转换(React Query select),例如列表原始行 → UI 模型 */ select?: (data: T) => TSelected; } /** * useQuery 的类型安全封装:queryFn 返回 unknown, * 由 zod schema 校验并收敛为 T,消除各页面重复的 * `validateResponse(schema, await api.get(...))` 样板。 */ export function useApiQuery(options: UseApiQueryOptions) { const { queryKey, queryFn, schema, enabled, staleTime, select } = options; return useQuery({ queryKey, enabled, staleTime, queryFn: async () => validateResponse(schema, await queryFn()), select, }); }