Type Check Assistant with Ramda

I want to write a function, the specification of which is described in the part of the code below, which is the current implementation that I have. He works. However, for some time I tried to write this for free and completely as composite ramda functions and could not find a solution. The problem is related to obj => map(key => recordSpec[key](obj[key])which I cannot reduce in such a way that I can write everything without problems.

How can i do

/** * check that an object : * - does not have any extra properties than the expected ones (strictness) * - that its properties follow the defined specs * Note that if a property is optional, the spec must include that case * @param {Object.<String, Predicate>} recordSpec * @returns {Predicate} * @throws when recordSpec is not an object */ function isStrictRecordOf(recordSpec) { return allPass([ // 1. no extra properties, i.e. all properties in obj are in recordSpec // return true if recordSpec.keys - obj.keys is empty pipe(keys, flip(difference)(keys(recordSpec)), isEmpty), // 2. the properties in recordSpec all pass their corresponding predicate // For each key, execute the corresponding predicate in recordSpec on the // corresponding value in obj pipe(obj => map(key => recordSpec[key](obj[key]), keys(recordSpec)), all(identity)), ] ) }

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

+4
source share
1 answer

One way to achieve this would be to use R.whereone that takes a spec object like yours recordSpecand applies each predicate with a value from the corresponding keys of the second object.

:

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

Source: https://habr.com/ru/post/1665476/


All Articles