1

我正在用这个 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一样,该实现使用tArrayas memoif nomemo提供的第一项。

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 的合理方式?

4

1 回答 1

1

正如错误所解释的那样,问题T是不可分配的。U以下是简述...

在您的示例中,如果memo未定义,则分配memo第一项tArray

if (memo === undefined) {
  memo = tArray[0]; 
}

您已声明它memoU并且您正试图为其分配 a 的值T

T !== U因此你会得到错误。

现在可能很想简单地使用它们来投射它们,memo = <U><any>tArray[0]但问自己“为什么这是必要的?”

memo持有的意图是什么?当有人使用不同的对象时会发生什么?

reduce<Car, Watermelon>(...)

我怀疑你在这里有不同的意图。难道它memo真的应该是 typeT | U吗?有T extend U吗?

沿着这<U><any>条路走下去可能会导致许多意外的运行时错误,并且随着 API 的增加很难找到错误。我认为您需要再看一下您想要的行为,然后再使用<U><any>.

于 2016-01-26T05:16:18.003 回答