Typescript 将(非嵌套)对象数组转换为具有完整键入的数组对象

Typescript 将(非嵌套)对象数组转换为具有完整键入的数组对象,typescript,Typescript,在javascript中,将一个对象数组转换为一个数组对象是一个常见的问题,但是在Typescript中如何在完全支持键入的情况下进行转换呢?这样做吗 ** * convert an array of (non nested) objects to an object of arrays. * assumes all objects are the same shape * */ type IndexObject = { [index: string]: any }; // hacky.

在javascript中,将一个对象数组转换为一个数组对象是一个常见的问题,但是在Typescript中如何在完全支持键入的情况下进行转换呢?

这样做吗

**
 * convert an array of (non nested) objects to an object of arrays.
 * assumes all objects are the same shape
 * */
type IndexObject = { [index: string]: any }; // hacky. :(
function pivot<T>(arr: (T & IndexObject)[]) {
  type Subset = { [K in keyof T]?: T[K] }; // make it optional to build the return array
  let ans: IndexObject & Subset = {};
  Object.keys(arr[0]).forEach(k => {
    ans[k] = arr.map(obj => obj[k]);
  });
  return ans as { [K in keyof T]: T[K] }; // take out the optionality of every key
}
**
*将(非嵌套)对象数组转换为数组对象。
*假设所有对象都是相同的形状
* */
类型IndexObject={[index:string]:any};//哈奇:(
功能轴(arr:(T&IndexObject)[]){
type Subset={[K in keyof T]?:T[K]};//使其成为构建返回数组的可选选项
设ans:IndexObject&Subset={};
Object.key(arr[0]).forEach(k=>{
ans[k]=arr.map(obj=>obj[k]);
});
将ans返回为{[K in keyof T]:T[K]};//去掉每个键的可选性
}
如果您有em

类型Pivot={
type Pivot<T> = {
    [K in keyof T]: T[K][];
} 

function pivot<T extends Record<any, any>>(items: T[]): Pivot<T> {
    return Object.keys(items[0]).reduce((obj, key) => {
        obj[key] = items.map(item => item[key])
        return obj
    }, {} as Pivot<T>)
}
[K in keyof T]:T[K][]; } 功能轴(项目:T[]):轴{ 返回对象。键(项[0])。减少((对象,键)=>{ obj[key]=items.map(item=>item[key]) 返回obj },{}作为枢轴) }

如果这在运行时不起作用,请提供示例输入和输出。如果这还不够“键入支持”,请添加应在编译时拒绝和接受的示例。

这真是太棒了。我喜欢它的简洁性。我肯定会在以后的问题中提供示例,因为现在我还在学习:)谢谢你,我接受了答案