> But the fact that you (and presumably plenty of others) seem to be having a great time with functional programming in TypeScript leads me to believe that there might be something I'm missing
I've noticed "functional programming" turned into an umbrella term.
For some people it means Haskell: strongly typed lazy evaluation with a focus on ADTs and functions that operate on them (i.e. methods) to achieve composition. Heavy use of pattern matching.
For others it means Clojure: dynamic language that favors raw duck-typed data manipulation. Heavy use of macros.
Then there's the pointfree crowd: very little use of literal functions, most of them are just composition of curried/partially-applied primitives.
For many it just means "I use map/filter/reduce".
And for most, it's just a mix-and-match of subsets of all those.
My experience matches yours: Typescript is mostly fine with map-filter-reduce and that's it. I'd love to be proved wrong though.