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

发布时间:2026/11/4 20:47:36

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/11/4 9:22:10

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

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

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

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

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

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

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

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

2026/11/5 13:55:19

GD32E10x官方例程入门:从GPIO点灯到串口调试

简介:这份GD32E10x系列官方例程面向嵌入式硬件与单片机开发者,基于ARM Cortex-M3内核,汇集兆易创新GD32E10x的示例代码,适合工业控制、消费电子、通信设备等场景的学习、验证与二次开发。压缩包共935个文件,约11.16MB&…

2026/11/5 13:50:18

基于Django的运维平台实战:资产、发布、巡检、告警一体化

简介:这份资源是一套基于Django框架开发的运维平台源码,面向具备Python基础、希望了解Web运维系统实现思路的开发者与运维人员,可用于学习主机管理、服务监控、日志查看、任务调度、权限控制、资源统计、脚本执行与故障告警等常见运维模块的落…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

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

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

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