Прежде всего, обратите внимание, что некоторые из ваших правил являются избыточными. Поскольку это должна быть строка или число, оно уже не может быть null
, false
или undefined
. Так что ваша логика может быть проще.
Я бы предложил использовать Ramda для нескольких вспомогательных функций, но, возможно, не использовать функцию Ramda без точек. Это, кажется, захватывает это просто отлично:
const isValid = s =>
(is (String, s) || is (Number, s)) && ! includes (s, [NaN, '-', '$', '0'] );
['a', 'b', 42, false, NaN, null, '-', '-0', '$', {}].forEach(s =>
console.log(`${s} => ${isValid(s)}`)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script><script>
const {is, includes} = R </script>
Обычная версия JS того же кода будет выглядеть так:
const isValid = s =>
(typeof s == 'string' || typeof s == 'number') && ! [NaN, '-', '$', '0'] .includes (s);
Версия Ramda немного проще и, на мой взгляд, немного более читабельна. Я бы никогда не включил Рамду только из-за этой маленькой разницы. Но если уже используется Ramda, то эта версия имеет смысл.
Но версия Ramda без баллов выглядит менее простой для меня. Это не ужасно, но я бы не стал его выбирать, даже если написать довольно просто:
const isValid = both (
either ( is (String), is (Number) ),
complement (includes (__, [NaN, '-', '$', '0'] ) )
)