如何重写代码以摆脱显式转换?
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
答案 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。