Javascript 使用Ramda检查类型助手

Javascript 使用Ramda检查类型助手,javascript,ramda.js,Javascript,Ramda.js,我想写一个函数,其规范在下面的代码段中描述,这是我当前的实现。它确实有效。然而,我已经尝试了一段时间来编写它,没有任何意义,完全是作为ramda函数的组合,并且找不到解决方案。这个问题与map(key=>recordSpec[key](obj[key])有关,我不能用一种无点编写整个过程的方式来简化它 我怎么办 /** *检查对象是否: *-没有任何超出预期的额外属性(严格性) *-其属性符合定义的规范 *请注意,如果属性是可选的,则规范必须包含该情况 *@param{Object.}reco

我想写一个函数,其规范在下面的代码段中描述,这是我当前的实现。它确实有效。然而,我已经尝试了一段时间来编写它,没有任何意义,完全是作为ramda函数的组合,并且找不到解决方案。这个问题与map(key=>recordSpec[key](obj[key])有关,我不能用一种无点编写整个过程的方式来简化它

我怎么办


/**
*检查对象是否:
*-没有任何超出预期的额外属性(严格性)
*-其属性符合定义的规范
*请注意,如果属性是可选的,则规范必须包含该情况
*@param{Object.}recordSpec
*@返回{谓词}
*@当recordSpec不是对象时抛出
*/
函数IsStritRecordof(recordSpec){
返回全通([
//1.无额外属性,即obj中的所有属性都在recordSpec中
//如果recordSpec.keys-obj.keys为空,则返回true
管道(键,翻转(差异)(键(recordSpec)),isEmpty),
//2.recordSpec中的属性都通过了相应的谓词
//对于每个键,在
//obj中的对应值
管道(obj=>map(key=>recordSpec[key](obj[key])、key(recordSpec))、all(identity)),
]
)
}

比如说,,

IsStritRecordof({a:isNumber,b:isString})({a:1,b:2'})->true
IsStritRecordof({a:isNumber,b:isString})({a:1,b:2',c:3})->false
IsStritRecordof({a:isNumber,b:isString})({a:1,b:2})->false

实现这一点的一种方法是使用,它接受一个spec对象,如您的
recordSpec
,并使用第二个对象对应键的值应用每个谓词

然后,您的函数将如下所示:

const isStrictRecordOf = recordSpec => allPass([
  pipe(keys, flip(difference)(keys(recordSpec)), isEmpty),
  where(recordSpec)
])

哇,这比我预期的要短。非常感谢。很难掌握众多的ramda函数。但我仍然想知道,如果
哪里
没有预料到,人们将如何免费编写这一点。但无论如何,我将测试答案,如果测试通过,我将接受它