在 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)
其余的键入应该很好地遵循
我正在使用 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)
其余的键入应该很好地遵循