如何更优定义HATEOAS API响应的TypeScript条件类型?
解决方案
可以通过条件类型结合数组元素推断实现泛型简化,核心思路是自动判断泛型参数是否为数组类型,从而映射到对应的API响应结构:
首先保留原有的Link和EntityResponse类型:
type Link = { href: string; ref: string; type: string; } type EntityResponse<T> = { links: Link[], data: T };
定义一个工具类型提取数组元素类型(也可直接内联到条件逻辑中):
type ArrayElement<T> = T extends (infer U)[] ? U : never;
最后重构Response泛型,仅保留一个参数,通过条件类型自动分支:
type Response<T> = { links: Link[]; data: T extends any[] ? EntityResponse<ArrayElement<T>>[] : EntityResponse<T>; };
效果验证
表示单实体响应时,直接传入实体类型:
// 对应API的单实体结构 type SingleProductResponse = Response<Product>;生成的类型结构匹配API返回:
{ links: Link[]; data: { links: Link[]; data: Product; }; }表示实体数组响应时,传入实体数组类型:
// 对应API的实体数组结构 type ProductListResponse = Response<Product[]>;生成的类型结构匹配API返回:
{ links: Link[]; data: Array<{ links: Link[]; data: Product; }>; }
核心逻辑说明
- 通过
T extends any[]判断泛型参数是否为数组类型 - 如果是数组,用
infer U提取数组元素类型U,映射为EntityResponse<U>[] - 如果不是数组,直接映射为
EntityResponse<T> - 全程未修改实体类型
Product,也无需额外条件参数
内容的提问来源于stack exchange,提问作者David Barker
相关产品推荐
相关产品推荐

