我正在使用此API编写库:
export var reduce = <T, U>(
tArray: T[],
tReducer: (current: U, tItem: T, index: number, tArray: T[]) => U,
options: IChunkifyOptions = DEFAULT_OPTIONS,
memo?: U
): Promise<U>
与标准JavaScript reduce一样,如果未提供tArray
,则memo
的第一项使用memo
。
if (memo === undefined) {
memo = tArray[0]; // Type 'T' is not assignable to Type 'U'
}
投射(<U>
)合理地给出Neither Type 'T' nor Type 'U' is assignable to the other.
定义API的合理方法是什么?
答案 0 :(得分:1)
问题在于T
无法分配给U
,因为错误会解释。这是破败的......
在您的示例中,如果未定义memo
,请为memo
tArray
if (memo === undefined) {
memo = tArray[0];
}
您已宣布memo
为U
并且您正在尝试为其分配T
T !== U
因此您会收到错误。
现在可能很容易使用memo = <U><any>tArray[0]
简单地投射它们,但问问自己&#34;为什么这是必要的?&#34;
您对memo
持有什么意图?当有人使用不同的对象时会发生什么?
reduce<Car, Watermelon>(...)
我怀疑你在这里有不同的意图。可能memo
应该是T | U
类型吗?是T extend U
?
走下<U><any>
路径可能会导致许多意外的运行时错误,并且随着API的增加很难找到错误。我认为您需要先尝试一下您想要的行为,然后才能轻松地使用<U><any>
。