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
都正确,老师为你的学习用心点赞!这个学习能力会给你未来职业技术生涯带去很大的好处。
00
相似问题