2017-01-02 3 views
4

Я хочу написать функцию, характеристики которой описаны в части кода ниже, которая является текущей реализацией, которую я имею. Он работает. Тем не менее, я некоторое время пытался написать это бесплатно и полностью как составные функции ramda и не мог найти решение. Проблема связана с obj => map(key => recordSpec[key](obj[key]), которую я не могу уменьшить таким образом, чтобы я мог написать все, что угодно.Тип проверки хелпера с Ramda

Как я могу это сделать?

/** * 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)), ] ) }

Например, 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

ответ

2

Одним из способов достижения этой цели будет использовать R.where, который принимает объект спецификации, как ваш recordSpec и применяет каждый предикат со значением из соответствующих клавишей второй объект.

Ваша функция будет выглядеть так:

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

ничего себе, что было меньше, чем я ожидал. Большое спасибо. трудно получить многочисленные функции ramda. Тем не менее я удивляюсь, если 'where' не ожидал, как можно было бы писать эту точку бесплатно. Но в любом случае, я собираюсь проверить ответ и принять его, если пройдут тесты – user3743222

Смежные вопросы