TypeScript:强制泛型T和U.

时间:2016-01-26 04:57:12

标签: typescript typescript-generics

我正在使用此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的合理方法是什么?

1 个答案:

答案 0 :(得分:1)

问题在于T无法分配给U,因为错误会解释。这是破败的......

在您的示例中,如果未定义memo,请为memo

中的第一项指定tArray
if (memo === undefined) {
  memo = tArray[0]; 
}

您已宣布memoU并且您正在尝试为其分配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>