使用 Ramda 和 Typescript 进行柯里化泛型函数

问题描述 投票:0回答:2

我有一个通用函数:

function hello<T>(n: number, s: string, thing: T): Array<T> {
  return [thing]
}

const result = hello(1, 'string arg', 'generic arg')

result
具有预期类型
string[]

但是如果我咖喱它:

function hello<T>(n: number, s: string, thing: T): Array<T> {
  return [thing]
}

const fun1 = curry(hello)(1, 'string arg')

const result = fun1('generic arg')

result
现在有类型
unknown[]

如何在保持类型的同时柯里化 Ramda 中的泛型函数?我正在使用 Ramda 0.27.1

typescript generics ramda.js currying
2个回答
2
投票

具有 3 个参数的

R.curry
的签名是:

curry<T1, T2, T3, TResult>(fn: (a: T1, b: T2, c: T3) => TResult): CurriedFunction3<T1, T2, T3, TResult>;

如您所见,您需要手动输入柯里化函数(codesandbox):

function hello<T>(n: number, s: string, thing: T): Array<T> {
  return [thing];
}

const fun1 = curry<number, string, string, string[]>(hello)(1, 'string arg');

const result = fun1('generic arg');

console.log(result);

0
投票

截至

ramda: "^0.29.1"
,我想出了以下解决方案:

function hello<T>(n: number, s: string, thing: T): Array<T> {
    return [thing];
}

const fun1 = R.curry(hello<string>)(1, "string arg");

const result = fun1("generic arg");

技巧是在创建柯里化函数时传递类型参数。之后,您应该收到正确的输出类型(即 string[])。

© www.soinside.com 2019 - 2024. All rights reserved.