在 Typescript 中使用 Ramda 管道输入错误

Typing Error using Ramda Pipe in Typescript

我正在使用 Ramda 的 pipe 方法。它运行良好,但在第一个参数 flatten.

上给出了一些 类型错误

我不确定它是关于什么的。谁能解释一下这个问题?

代码:https://stackblitz.com/edit/ramda-playground-vcljpy

错误:

抱歉标题幼稚

谢谢

您需要明确提供类型 R.pipe:

const mergeData: any = pipe<
  [Data[][]], // arguments supplied to the pipe
  Data[], // result of flatten
  Data[], // result of filter
  Record<string, Data[]>, // result of groupBy
  Data[][], // result of values
  Data[], // result of map(combine)
  RankedData[] // result of last
>(

这适用于以下软件包的版本及更高版本:

"@types/ramda": "0.27.34",
"ramda": "0.27.1"

这是工作示例的代码 (sandbox):

interface Data {
  name: string;
  val: number;
}

interface RankedData extends Data {
  rank: string;
}

const ranks = {
  a: 'si',
  b: 'dp',
  d: 'en',
  c: 'fr'
};

// merge deep and combine val property values
const combine = mergeWithKey((k, l, r) => (k === 'val' ? l + r : r));

const mergeData: any = pipe<
  [Data[][]],
  Data[],
  Data[],
  Record<string, Data[]>,
  Data[][],
  Data[],
  RankedData[]
>(
  flatten,
  filter((o: Data) => Object.keys(ranks).includes(o.name)),
  groupBy(prop('name')), // group by the name
  values, // convert back to an array of arrays
  map(reduce(combine, {} as Data)), // combine each group to a single object
  map((o) => ({
    ...o,
    rank: ranks[o.name]
  }))
);

我通常通过指向管道中的第一个函数来显式键入它(x: Data[][]) => flatten(x)其余的键入应该很好地遵循