They're literally type-level functions, yeah. The value isn't in catching every possible bug—it's in making refactors not terrifying and keeping your IDE from lying to you.
any scales to exactly one person. The moment someone else touches your code or you come back in six months, you're debugging at runtime instead of reading the types. I've watched codebases die this way.
Complex conditional types are valid to avoid though. If you're writing recursive type math just to satisfy the type checker, you've usually taken a wrong turn. I stick to simple generics and concrete types. Works fine.