原文链接:
https://frontendmasters.com/blog/fun-with-typescript-generics/

文章要点:
- 核心目标:通过实现一个完全类型化的 refetchedQueryOptions 辅助函数,展示 TypeScript 泛型与条件类型的高级用法,解决 TanStack Start 中服务器函数与 React Query 选项同步时的类型安全问题
- 基础概念:回顾泛型作为"类型参数"的本质,通过 filterTyped<T extends User> 示例说明泛型约束如何保留具体类型;介绍条件类型 T extends Array<infer U> ? U : never 用于类型推断与转换
- 问题场景:初始实现使用 any 导致查询数据类型丢失,需要支持两种服务器函数签名(带参数/不带参数),且要求参数类型自动推断、可选参数根据函数签名动态要求
- 关键技术:使用函数重载(Function Overloading)定义两个签名版本,结合条件类型 ServerFnHasArgsServerFnWithArgs/ServerFnWithoutArgs 检测函数参数存在性,通过 infer 关键字提取参数类型
- 实现细节:定义 AnyAsyncFn 基础类型,利用 Parameters<T>[0]["data"] 提取服务器函数参数,最终通过重载签名分别处理带参和不带参的函数调用,确保类型安全与 IDE 提示友好

核心总结:
本文通过一个实际的 TanStack Start 场景,深入演示了 TypeScript 泛型、条件类型和函数重载的组合应用。作者从基础的泛型约束讲起,逐步构建出能自动推断服务器函数参数类型、并根据参数存在性动态调整函数签名的类型系统,最终实现了完全类型安全的查询选项封装,展示了 TypeScript 类型系统解决复杂实际问题的强大能力。 Fun with TypeScript Generics
 
 
Back to Top