从对象数组到对象

时间:2018-02-03 15:05:25

标签: typescript

如何重写代码以摆脱显式转换?

type A={a:number};
type B={b:string};


let a:A={a:0};
let b:B={b:''};

function arrayToObject<T>(array:T[]):T {
    return array.reduce((r,c) =>Object.assign(r,c))
}

let result = arrayToObject([a,b]);//expects A&B instead A|B

2 个答案:

答案 0 :(得分:1)

遗憾的是,无法将联合类型转换为交集类型。定义Dbc::get的方式也很明显:

Object.assign

assign<T, U>(target: T, source: U): T & U; assign<T, U, V>(target: T, source1: U, source2: V): T & U & V; assign<T, U, V, W>(target: T, source1: U, source2: V, source3: W): T & U & V & W; assign(target: object, ...sources: any[]): any; 为最多3个来源提供了几种强类型版本,而对于更多lib.d.ts,只需成为sources的数组,且没有类型安全。

您可以使用类似的方法:

any

答案 1 :(得分:0)

基本上问题是reduce有类型:(T, T): T,这会导致Object.assign认为它也有类型(T, T): T

所以问题是你想为一个任意长度的数组做这个,如果你在数组中有不同数量的元素你可以打开循环并使用``Òbject.assign(A,B)形式:A&amp; B```。

但是你想要的东西在Typescript中可能是不可能的,因为你需要为函数的结果创建一个类型,它是任意数组union类型的交集类型。如果你可以声明这样的类型,那么你可以用循环替换reduce。