如何在打字稿中使用撰写?

时间:2019-02-20 12:55:26

标签: typescript ramda.js

在Typescript中使用compose时遇到问题。...

const rawHeaders = R.compose(
  R.join('\n'),
  R.map(x=>`${x[0]}: ${x[1]}`),
  R.toPairs
)

我尝试了以下方法,但这很残酷。有人知道一种使这项工作更优雅的方法吗?

const rawHeaders:Function = R.compose(
  R.join('\n'),
  R.map((x:[String, String]) =>`${x[0]}: ${x[1]}`),
  (x:{s:String})=>R.toPairs(x))
)

我也尝试过使用ts-ignore,目前看来这是最好的选择。

const rawHeaders = R.compose(
  R.join('\n'),
  // @ts-ignore
  R.map(x=>`${x[0]}: ${x[1]}`),
  // @ts-ignore
  R.toPairs
)

1 个答案:

答案 0 :(得分:1)

您是否尝试过利用compose本身的类型?您可以在compose中为它提供参数和每个函数的返回值,如下所示:

const rawHeaders = R.compose<
  { [key: string]: string | number }, // Argument
  Array<[string, string]>, // Return of toPairs
  string[], // Return of map
  string // Return of join
>(
  R.join('\n'),
  R.map(x => `${x[0]}: ${x[1]}`),
  R.toPairs
);

我个人更喜欢使用pipe,因为键入与pipe中的参数顺序匹配,而compose则倒退:

const rawHeaders = R.pipe<
  { [key: string]: string | number }, //Argument
  Array<[string, string]>, // return of toPairs
  string[], // return of map
  string // return of join
>(
  R.toPairs,
  R.map(x => `${x[0]}: ${x[1]}`),
  R.join('\n')
);

无论哪种方式,pipe / compose中的每个函数都将获得正确的值,并且您不需要专门在管道中修饰该函数(除非您开始使用类似R.flip的东西)。它很冗长,但可以。

(您可以为第一个函数指定尽可能多的args,重载将处理其余的btw)