You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更优定义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;
        }>;
    }
    

核心逻辑说明

  1. 通过T extends any[]判断泛型参数是否为数组类型
  2. 如果是数组,用infer U提取数组元素类型U,映射为EntityResponse<U>[]
  3. 如果不是数组,直接映射为EntityResponse<T>
  4. 全程未修改实体类型Product,也无需额外条件参数

内容的提问来源于stack exchange,提问作者David Barker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:30:26