如何为含计算属性键的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
相关产品推荐
相关产品推荐

