Ваше регулярное выражение ^[+]?[0-9\s-]*$
соответствует строке, которая начинается с необязательного плюса ([+]?
) и затем имеет неограниченное количество (0 или более) цифр, пробелов или дефисов, таким образом, оно даже соответствует строке "+ --- "
:

Вам нужно использовать
/^\+?[0-9]+(?:[\s-][0-9]+)*$/
См. Демонстрационную версию regex и график regulex :

Не забудьте оставить -
в конце класса символов в [\s-]
, если вы хотите оставить его без экранирования или избежать дефиса внутри класса символов, [\s\-]
.
Детали
^
- начало строки
\+?
- необязательный +
символ
[0-9]+
- одна или несколько цифр
(?:[\s-][0-9]+)*
- группа без захвата, которая соответствует 0 или более повторениям
[\s-]
- класс символов, соответствующий одному пробелу или -
[0-9]+
- 1 или более цифр
$
- конец строки