TanStack Query Svelte 的 DefinedCreateQueryResult 类型:理解 createQuery 与 initialData 的非空数据契约

发布时间:2026/9/10 2:31:13

TanStack Query Svelte 的 DefinedCreateQueryResult 类型:理解 createQuery 与 initialData 的非空数据契约 TanStack Query Svelte 的 DefinedCreateQueryResult 类型理解 createQuery 与 initialData 的非空数据契约【免费下载链接】query Powerful asynchronous state management, server-state utilities and data fetching for the web. TS/JS, React Query, Solid Query, Svelte Query and Vue Query.项目地址: https://gitcode.com/GitHub_Trending/qu/query导读本文聚焦 Svelte 生态下 TanStack Querytanstack/svelte-query暴露的一个关键类型别名——DefinedCreateQueryResult。它定义了createQuery在提供initialData时返回结果的 TypeScript 类型形状其核心价值在于一旦查询配置了初始数据编译器就能保证data永远不为undefined从而在模板中省去繁琐的空值分支判断。读完本文你将掌握该类型的定义来源、类型参数语义、它与DefinedQueryObserverResult的继承关系以及它在createQuery、queryOptions、createQueries中如何影响类型推断并能结合类型测试理解其行为边界。类型定义一行别名背后的三层契约DefinedCreateQueryResult的定义极其精简完整声明位于 packages/svelte-query/src/types.ts:87-90/** Options for createQuery with initialData */ export type DefinedCreateQueryResult TData unknown, TError DefaultError, DefinedCreateBaseQueryResultTData, TError它本身是DefinedCreateBaseQueryResult的别名而后者同文件 packages/svelte-query/src/types.ts:80-84又指向tanstack/query-core中导出的DefinedQueryObserverResult/** Options for createBaseQuery with initialData */ export type DefinedCreateBaseQueryResult TData unknown, TError DefaultError, DefinedQueryObserverResultTData, TError追踪到核心层 packages/query-core/src/types.ts:890-902可以看到最终的真身是一个联合类型export type DefinedQueryObserverResult TData unknown, TError DefaultError, | QueryObserverRefetchErrorResultTData, TError | QueryObserverSuccessResultTData, TError export type QueryObserverResultTData unknown, TError DefaultError | DefinedQueryObserverResultTData, TError | QueryObserverLoadingErrorResultTData, TError | QueryObserverLoadingResultTData, TError | QueryObserverPendingResultTData, TError | QueryObserverPlaceholderResultTData, TError从源码结构可以清晰看到整个继承链DefinedCreateQueryResultTData, TError └── DefinedCreateBaseQueryResultTData, TError (svelte-query/src/types.ts) └── DefinedQueryObserverResultTData, TError (query-core/src/types.ts) ├── QueryObserverRefetchErrorResult └── QueryObserverSuccessResult这条链的核心语义是「Defined」意味着结果中只可能处于success或「重取失败但数据仍在」两种状态。对照普通QueryObserverResult还包含pending、loading、loadingError、placeholder等状态DefinedQueryObserverResult明确排除了数据缺失的一切可能性——因为initialData保证了查询从一开始就有数据可用。类型参数TData 与 TError 的默认值与含义与原文档一致DefinedCreateQueryResult接受两个类型参数参数默认值含义TDataunknown查询成功后或使用initialData/select转换后的数据类型。在Defined场景下data字段的类型就是TData本身而非TData \| undefinedTErrorDefaultError错误对象类型默认取tanstack/query-core中的DefaultError通常为Error可通过throwOnError配置推导细化TData在createQuery的签名中通常由TQueryFnData或select函数返回值推导而来详见 packages/svelte-query/src/createQuery.ts:74-84而TError默认即DefaultError导入自tanstack/query-core见 packages/svelte-query/src/types.ts:3。何时触发 Defined 结果initialData 驱动的重载选择DefinedCreateQueryResult并非总是createQuery的返回类型——它只在配置了initialData时被启用。这通过createQuery的函数重载实现packages/svelte-query/src/createQuery.ts:74-132无initialData重载参数类型为UndefinedInitialDataOptions返回CreateQueryResultTData, TError此时data的类型包含undefined有initialData重载参数类型为DefinedInitialDataOptions返回DefinedCreateQueryResultTData, TError此时data恒为TData。两个选项类型定义在 packages/svelte-query/src/queryOptions.ts:10-28export type UndefinedInitialDataOptions... CreateQueryOptions... { initialData?: undefined | InitialDataFunctionNonUndefinedGuardTQueryFnData } export type DefinedInitialDataOptions... CreateQueryOptions... { initialData: | NonUndefinedGuardTQueryFnData | (() NonUndefinedGuardTQueryFnData) }注意DefinedInitialDataOptions中的initialData是必填的且其类型为NonUndefinedGuardTQueryFnData即排除了undefined的类型可以是静态值或惰性函数。这意味着传入对象字面量initialData: { wow: true }→ 走 Defined 重载data类型为{ wow: true }传入返回undefined的函数initialData: () undefined→ 会被收窄到UndefinedInitialDataOptions重载data类型仍包含undefined完全不传initialData→CreateQueryResultdata为TData | undefined。这种设计让「是否有初始数据」这一运行时事实直接映射为编译期的类型事实避免模板中对data做不必要的空值断言。类型参数部分提供的语法糖queryOptions 的等价路径同样的 Defined/Undefined 二分也被queryOptions采用packages/svelte-query/src/queryOptions.ts:68-121。它有两个重载传入DefinedInitialDataOptions时返回带数据标签QueryKeyWithDataTag的DefinedInitialDataOptions传入UndefinedInitialDataOptions时返回对应的UndefinedInitialDataOptions。因此把带initialData的选项放进queryOptions再传给createQuery依然能拿到DefinedCreateQueryResult的非空数据保证script langts import { createQuery, queryOptions } from tanstack/svelte-query const postsOptions queryOptions({ queryKey: [posts], queryFn: fetchPosts, initialData: [], // 必须提供否则退回 CreateQueryResult }) const query createQuery(() postsOptions) /script {#if query.isError} spanError: {query.error.message}/span {/if} ul {#each query.data as post (post.id)} li{post.title}/li {/each} /ulcreateQueries 中的 Defined 推断逻辑createQueries同样遵循「有initialData则返回 Defined 结果」的规则。其内部通过条件类型GetDefinedOrUndefinedQueryResult做推断packages/svelte-query/src/createQueries.svelte.ts:78-93核心逻辑可概括为若选项不含initialData→CreateQueryResult若initialData类型为unknown未显式提供→CreateQueryResult若initialData的值类型可赋给TData→DefinedCreateQueryResult若initialData是函数则递归检查其返回类型——只有返回类型非undefined且可赋给TData时才返回DefinedCreateQueryResult否则回落为CreateQueryResult。这一步与createQuery的重载行为保持严格一致函数形式的initialData只有在确定不会返回undefined时才能兑现非空数据契约。类型测试验证行为即契约仓库中的类型测试直接固化了上述行为是理解该类型最权威的旁证。packages/svelte-query/tests/createQuery/createQuery.test-d.ts:6-50 中覆盖了四种典型场景以对象形式提供initialData: { wow: true }→expectTypeOf(data).toEqualTypeOf{ wow: boolean }()不含undefined通过queryOptions传递同样成立未提供initialData→data类型为{ wow: boolean } | undefined提供initialData: () undefined as { wow: boolean } | undefined函数可返回undefined→ 回落为{ wow: boolean } | undefined。这些断言证明DefinedCreateQueryResult的非空保证并非类型层面的「声明」而是由重载与条件类型双重约束下、被测试锁定的稳定契约。实践指南何时依赖 Defined 结果DefinedCreateQueryResult的价值在服务端渲染、乐观 UI 与「列表永不空白」类场景中尤为明显。以 packages/svelte-query/src/createQuery.ts:98-120 中的官方示例为例script langts import { createQuery } from tanstack/svelte-query // data 是 Post[]绝不会是 undefined——即使 refetch 失败 // 列表依然可见错误信息与之并存。 const query createQuery(() ({ queryKey: [posts], queryFn: fetchPosts, initialData: [], })) /script {#if query.isError} spanError: {query.error.message}/span {/if} ul {#each query.data as post (post.id)} li{post.title}/li {/each} /ul使用要点initialData必须与TQueryFnData类型兼容DefinedInitialDataOptions要求其为NonUndefinedGuardTQueryFnData类型不符会在编译期报错createQueries测试中亦有ts-expect-error (initialData: string)的断言佐证见 packages/svelte-query/tests/createQueries/createQueries.test-d.ts:128-129区分initialData与placeholderDatainitialData会被写入缓存并视为真实数据影响gcTime/持久化而placeholderData仅用于展示层占位、不进入缓存见 packages/query-core/src/types.ts:428 的注释DefinedCreateQueryResult只由initialData触发可配合initialDataUpdatedAtQueryOptions支持initialDataUpdatedAt?: number | (() number | undefined)packages/query-core/src/types.ts:260用于让初始数据的「新鲜度时间戳」与后台 refetch 的staleTime判定协同工作避免初始数据被误判为过期而立即重取错误状态下的行为即使 refetch 失败由于DefinedQueryObserverResult只含success与refetchError两种分支data依旧保留初始值query.error与query.data可以同时存在——这正是上面示例中「错误提示 数据列表并存」的底气。小结DefinedCreateQueryResult是 TanStack Query Svelte 类型体系中的一个枢纽它以initialData为触发器通过重载createQuery/queryOptions与条件类型createQueries将「运行时已有数据」这一事实编码进类型系统最终让data在编译期保持非空。其底层依托tanstack/query-core的DefinedQueryObserverResult联合类型排除了pending/loading等无数据状态。无论是单查询还是并行查询只要提供非undefined的initialData你就能获得从数据声明到模板渲染全链路的类型安全。【免费下载链接】query Powerful asynchronous state management, server-state utilities and data fetching for the web. TS/JS, React Query, Solid Query, Svelte Query and Vue Query.项目地址: https://gitcode.com/GitHub_Trending/qu/query创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/10 2:26:13

AI率过高如何解决?2026年10款主流降AI率工具终极亲测指南

现在毕业生答辩前的头号难关,早就从“查重率超标”变成“AIGC率踩红线”啦!各大高校检测系统一升级,AI痕迹太明显被标红,那可是答辩路上的“致命关卡”,半点儿都马虎不得。 为啥自己改来改去还是过不了?因…

2026/9/10 3:26:18

深入GPU用户态驱动:命令提交、显存管理与同步机制实战解析

如果你正在读这篇,说明大概率已经看完了GPU UMD学习指南的stage1part1,或者至少已经知道用户态驱动这五个字大概指的是什么。Part1主要是建环境和建立整体观:驱动栈分几层、UMD和KMD各管什么、一套最基础的开发环境怎么搭。到了stage1part2&a…

2026/9/10 3:26:18

RK平台MIPI PHY与电源树协同调试指南

简介:本资源是面向嵌入式Linux驱动开发工程师与RK3568平台硬件适配人员的YT8521S千兆以太网PHY芯片驱动补丁包,解决该PHY在Rockchip RK3568平台(内核4.19/4.4)上缺失原生支持、无法完成链路建立与环回测试的问题。压缩包共11个文件…

2026/9/10 3:26:18

CANN/GE ES构图可选输入样例

样例使用指导 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前…

2026/9/10 3:26:18

CANN/ge Transformer ES构图示例

样例使用指导 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前…

2026/9/10 3:21:18

树莓派Pico的USB虚拟串口进阶:用select实现稳定数据通信

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码