Это решение не нарушает типизацию, а наоборот - вы точно знаете что в этом случае в T будет именно number и поэтому `return this._numberStep(value)` полностью валидно. А вот компилятор не знает, и вы ему таким образом даете подсказку.
Конечно лучше если он сам смог вы сузить T до number в этом случае, но тут придется немного помочь.
Возможно есть какая-то конструкция чтобы разрулить типы автоматически без as, но при беглом размышлении в готову ничего не приходит, да и будет это по сути то же самое (дать компилятору понять что тут все ок) только с гораздо большим количеством доп кода.
Пишите as и спите спокойно.