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

如何为含计算属性键的endpointMeta对象添加TypeScript类型?

为endpointMeta添加强类型约束,强制匹配服务与端点元信息

我需要给项目里的endpointMeta对象添加正确的TypeScript类型,这个对象的计算属性键关联两个核心对象:

  • services:枚举类型,包含当前所有服务名称,后续会新增
  • endpoints:定义各服务对应的可用端点

现有代码如下:

enum services {
    serviceNameOne = 'service1',
    serviceNameTwo = 'service2',
    serviceNameThree = 'service3',
};

const endpoints = {
    [services.serviceNameOne]: {
        getUser: '/getUser',
        verifyDetails: '/s/verifyDetails',
    },
    [services.serviceNameTwo]: {
        fetchCustomersv1: '/v1/fetchCustomers',
        fetchCustomersv2: '/v2/fetchCustomersv1',
    },
    [services.serviceNameThree]: {
        getAllProjects: '/g/a/p',
        getProject: '/g/p',
        updateProject: '/u/p',
    }
}

endpointMeta用来存储端点元信息,但目前存在类型缺失、重复键、属性名错误的问题:

const endpointMeta = {
    [services.serviceNameOne]:{
        [endpoints.serviceOne.getUser]: { // 属性名错误,应为serviceNameOne
            description: 'something about getUser',
            version: 1
        },
        [endpoints.serviceOne.verifyDetails]:{
            description: 'something about verifyDetails',
            version: 3
        },
    },
    [services.serviceNameTwo]:{
        [endpoints.serviceTwo.fetchCustomersv1]: { // 属性名错误,应为serviceNameTwo
            description: 'something about fetchCustomersv1',
            version: 1
        },
        [endpoints.serviceTwo.fetchCustomersv1]:{ // 重复键
            description: 'something about fetchCustomersv1',
            version: 1
        },
    }
}

核心需求:新增服务或端点时,必须为endpointMeta添加对应元信息,TypeScript要强制检查,不允许遗漏、错误或重复


解决方案

步骤1:锁定endpoints的字面量类型

用as const让TypeScript保留endpoints的精确字面量类型,确保后续能获取到每个端点的具体路径值:

const endpoints = {
    [services.serviceNameOne]: {
        getUser: '/getUser',
        verifyDetails: '/s/verifyDetails',
    },
    [services.serviceNameTwo]: {
        fetchCustomersv1: '/v1/fetchCustomers',
        fetchCustomersv2: '/v2/fetchCustomersv1',
    },
    [services.serviceNameThree]: {
        getAllProjects: '/g/a/p',
        getProject: '/g/p',
        updateProject: '/u/p',
    }
} as const;

步骤2:定义单个端点的元信息结构

先明确单个端点元信息的固定格式:

type EndpointMetaItem = {
    description: string;
    version: number;
};

步骤3:构建endpointMeta的强类型

通过typeof endpoints推导服务与端点的映射关系,生成EndpointMeta类型,确保每个服务下的每个端点都必须有对应元信息:

type EndpointMeta = {
    [K in keyof typeof endpoints]: {
        [P in typeof endpoints[K][keyof typeof endpoints[K]]]: EndpointMetaItem;
    };
};

步骤4:用类型约束endpointMeta

现在用EndpointMeta约束endpointMeta对象,TypeScript会自动执行以下检查:

  • 是否遗漏了某个服务
  • 是否遗漏了服务下的某个端点
  • 是否存在重复键或错误键
const endpointMeta: EndpointMeta = {
    [services.serviceNameOne]:{
        [endpoints.serviceNameOne.getUser]: {
            description: '获取用户基础信息',
            version: 1
        },
        [endpoints.serviceNameOne.verifyDetails]:{
            description: '验证用户身份与详情',
            version: 3
        },
    },
    [services.serviceNameTwo]:{
        [endpoints.serviceNameTwo.fetchCustomersv1]: {
            description: 'v1版本获取客户列表',
            version: 1
        },
        [endpoints.serviceNameTwo.fetchCustomersv2]:{
            description: 'v2版本获取客户列表(支持多条件筛选)',
            version: 2
        },
    },
    [services.serviceNameThree]:{ // 必须添加该服务的元信息,否则TS报错
        [endpoints.serviceNameThree.getAllProjects]: {
            description: '获取系统内所有项目',
            version: 1
        },
        [endpoints.serviceNameThree.getProject]:{
            description: '根据ID获取单个项目详情',
            version: 1
        },
        [endpoints.serviceNameThree.updateProject]:{
            description: '更新项目基础信息',
            version: 2
        },
    }
};

效果说明

  • 新增服务到services枚举和endpoints后,EndpointMeta会自动更新,endpointMeta必须添加对应服务的元信息,否则TypeScript报错
  • 给现有服务新增端点后,endpointMeta必须补充该端点的元信息,否则报错
  • 重复键、错误键(比如写错服务名或端点名)都会被TypeScript即时检测到

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:01:09