在打字稿中使用Ramda撰写并遇到问题

时间:2018-03-30 12:53:17

标签: typescript ramda.js

我尝试将ramda与打字稿一起使用,但我遇到了类型问题,尤其是在使用compose时。 以下是依赖项:

"devDependencies": {
  "@types/ramda": "^0.25.21",
  "typescript": "^2.8.1",
},
"dependencies": {
  "ramda": "^0.25.0"
},

这是代码:

import { curry, compose, reject, isNil, tail } from 'ramda'

const arrayToObj = curry((props: string[], array: any[]): Record<string, any> => {
  const len = props.length
  const result: Record<string, any> = {}
  if (len > array.length) throw "TODO: arrayToObj not mathcing size"
  for (let i = 0; i < len; ++i) result[props[i]] = array[i]
  return result
})

const matchRegExp = curry((
  pattern: RegExp, part: string
) => part.match(pattern))


const partToMatch = matchRegExp(new RegExp([
  /^\s*/,                           // skip spaces at begin
  /([TJQKA2-9]{2})([so])?/,         // first two cards
  /(?:-([TJQKA2-9]{1,2})([so])?)?/, // Extender
  /([-+*/])?/,                      // Expander
  /(?:\(([1-9]\d?)(%)?\))?/,        // Shrinker
].map(r => r.source).join(''), 'i'))

const matchToObject = arrayToObj([
  'x', 'group0', 'flag0',
  'group1', 'flag1', 'exp', 'shrink', 'percent'
])

const partToObject = compose(
  reject(isNil),
  matchToObject,
  tail,
  partToMatch
)

我在撰写时使用tail告诉我列表中的类型错误:List: ReadonlyArray<T>x: string不兼容(来自compose的定义)。 如果我移除尾巴一切正常。我试图将matchRegExp的输出转换为string[],但没有任何区别。我知道如果不加注matchRegExp,则返回RegExpMatchArray,但如果它的插件没有matchToObject函数的尾部,则不会引发任何问题。这让我很困惑,如果有人明白为什么我会收到这个错误,我真的很感激。

在尝试解决问题时,我尝试在compose之前插入tail以插入Array.from方法,但却出现此错误from is not defined in type 'ArrayConstructor'。我想这是另一个问题,但这又让我感到困惑。

1 个答案:

答案 0 :(得分:0)

我不太了解Typescript类型,但是在这里删除它们,我通过移除x中的arrayToObject属性,转换

来实现这一点
'9Qs-To*(30%)'

到这个

{
  exp: '*',
  flag0: 's',
  flag1: 'o',
  group0: '9Q',
  group1: 'T',
  percent: '%',
  shrink: '30'
}

并不是说我知道这意味着什么(除了与扑克牌有某种关系!)

x属性是否会在您添加tail之前保留初始空格?

顺便说一句,我真的很喜欢你在Javascript中模拟多行正则表达式的技巧。我以前没见过。