TypeScript如何根据传入枚举数组严格约束返回对象键类型
严格类型约束实现方案
通过泛型收窄入参的枚举成员范围,直接映射返回值的必填键类型,无需使用Partial做可选标记,具体实现如下:
核心修改逻辑
- 给函数添加泛型参数
T,约束为目标枚举的子类型,TS会根据实际传入的数组自动推导T为传入元素的联合类型 - 返回值类型直接使用
Record<T, string[]>,强制要求返回对象必须包含所有传入的枚举成员作为键,且值为字符串数组 - 函数内部初始化结果对象时做类型断言即可,逻辑上循环会给所有传入的键赋值,不存在属性缺失问题
完整实现代码
// 模拟从数据库获取分组选项的方法 async function getGroupFromDb(group: Seasons): Promise<string[]> { return []; } enum Seasons { Spring = 1001, Summer = 1002, Fall = 1003, Winter = 1004, } export async function getGroupOptions<T extends Seasons>(groups: T[]): Promise<Record<T, string[]>>{ const result = {} as Record<T, string[]>; for(const group of groups){ result[group] = await getGroupFromDb(group); } return result; }
类型效果
- 当传入
[Seasons.Spring, Seasons.Fall]时,返回值自动推导为Promise<Record<Seasons.Spring | Seasons.Fall, string[]>> - 访问返回值中未传入的枚举键(比如
Seasons.Summer)时,TS会直接抛出类型错误 - 访问传入的对应键时,无需可选链判空,TS可识别该属性必然存在
内容的提问来源于stack exchange,提问作者Taxel
相关产品推荐
相关产品推荐

