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

如何用TypeScript泛型实现按嵌套属性类型映射记录列表?

解决方案:实现类型安全的RecordsByType

要让RecordsByType的每个键对应具体记录类型的数组,可以通过映射类型结合Extract条件类型实现,精准关联键名与对应记录类型:

type RecordsByType = Partial<{
  [T in RecordTypeName]: Extract<RecordType, { attributes: { type: T } }>[]
}>;

代码验证

替换原代码中的RecordsByType = unknown后,完全符合预期逻辑:

  1. 类型匹配通过:const accounts: Account[] = recordsByType['Account'] || []; 编译正常,recordsByType['Account']被推导为Account[]
  2. 非法操作拦截:recordsByType['Account']?.push(user); 编译失败,User类型无法推入Account[]

原方案问题分析

  • 第一种实现使用DbRecord[]作为数组类型,属于最上层通用类型,丢失了子类型的具体属性(如name、email),无法满足Account[]的赋值要求
  • 第二种泛型实现未建立键名T与具体记录类型的关联,导致K始终是RecordType联合类型,最终返回的数组类型为RecordType[],无法区分具体类型

扩展性说明

后续新增RecordTypeName成员和对应记录类型时,只需更新RecordTypeName和RecordType联合类型,RecordsByType会自动推导新的键值类型,无需额外修改映射逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:42:24