我尝试将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'
。我想这是另一个问题,但这又让我感到困惑。
答案 0 :(得分:0)
我不太了解Typescript类型,但是在这里删除它们,我通过移除x
中的arrayToObject
属性,转换
'9Qs-To*(30%)'
到这个
{
exp: '*',
flag0: 's',
flag1: 'o',
group0: '9Q',
group1: 'T',
percent: '%',
shrink: '30'
}
并不是说我知道这意味着什么(除了与扑克牌有某种关系!)
x
属性是否会在您添加tail
之前保留初始空格?