如何用TypeScript泛型实现按嵌套属性类型映射记录列表?
解决方案:实现类型安全的RecordsByType
要让RecordsByType的每个键对应具体记录类型的数组,可以通过映射类型结合Extract条件类型实现,精准关联键名与对应记录类型:
type RecordsByType = Partial<{ [T in RecordTypeName]: Extract<RecordType, { attributes: { type: T } }>[] }>;
代码验证
替换原代码中的RecordsByType = unknown后,完全符合预期逻辑:
- 类型匹配通过:
const accounts: Account[] = recordsByType['Account'] || [];编译正常,recordsByType['Account']被推导为Account[] - 非法操作拦截:
recordsByType['Account']?.push(user);编译失败,User类型无法推入Account[]
原方案问题分析
- 第一种实现使用
DbRecord[]作为数组类型,属于最上层通用类型,丢失了子类型的具体属性(如name、email),无法满足Account[]的赋值要求 - 第二种泛型实现未建立键名
T与具体记录类型的关联,导致K始终是RecordType联合类型,最终返回的数组类型为RecordType[],无法区分具体类型
扩展性说明
后续新增RecordTypeName成员和对应记录类型时,只需更新RecordTypeName和RecordType联合类型,RecordsByType会自动推导新的键值类型,无需额外修改映射逻辑。
内容的提问来源于stack exchange,提问作者ondrakr
相关产品推荐
相关产品推荐

