getSubItemFrmArr函数中两个泛型作用

来源:6-23 TS 装饰器重构 Koa 路由准备—方法装饰器

慕粉3946981

2023-07-04

返回一个联合类型,联合类型中的每个成员类型取决于T数组中元素类型
如果T中所有元素的类型一致则不会生成一个联合类型则,而是生成数组元素的类型

export type EleOfArr<T> = T extends Array<infer E> ? E : never

keyof EleOfArr 代表

  • 如果 EleOfArr 返回的类型是一个对象类型则 keyof 取对象类型中的key组成一个联合类型
  • 如果 EleOfArr 返回的类型是一个联合类型则 keyof 取每个联合类型共有的key组成一个联合类型

[K in keyof EleOfArr] 中的K会分发每个联合类型,返回一个对象类型

  • 每次分发:[当前联合类型成员]: 对象类型[当前联合类型成员]
export type ItemType<T extends object[]> = {
  [K in keyof EleOfArr<T>]: EleOfArr<T>[K]
}


简单描述就是
type EleOfArr = T extends Array ? E : never ; 获取数组中对象的类型
keyof EleOfArr; 获取对象类型key组成的联合类型
ItemType 获取数组中对象的类型
ItemType[] 与数组默认推导出来的类型一致


为什么能自动推导出数组类型还需要手动定义 ItemType 类型?
因为在 getSubItemFrmArr 提取数组的元素部分属性函数中,泛型K被约束为一个联合类型,联合类型中的每个成员是 ItemType 生成对象类型的 key。

  • 可以在遍历数组t中每个对象时,用 keys 数组里面的元素索引 (核心作用)
function getSubItemFrmArr<T extends ItemType<T>[], K extends keyof EleOfArr<T>>(
  t: T, 
  ...keys: K[] 
) {
  return t.map(item => {
    return keys.reduce((pre, cur) => {
      return { ...pre, [cur]: item[cur] }
    }, {} as Pick<EleOfArr<T>, K>) // 空对象字面量可以被断言成特定对象类型实例
  })
}

麻烦老师帮我看看上述描述是否正确。

写回答

1回答

keviny79

2023-07-05

都正确,老师为你的学习用心点赞!这个学习能力会给你未来职业技术生涯带去很大的好处。

0
0

前端高手养成计划-从前端到后端,全栈开发大型项目

从纯前端到“真正懂后端的前端”

215 学习 · 134 问题

查看课程