There is also a case for using interpolation on the client-side, not just prediction.
In the case of the Source engine (e.g. Counter Strike), there are buffered patches on the client side.
Ex. Client receives state update N, it buffers the update and instead interpolates between N-1 and N (this mitigates packet loss issues from UDP - the engine has settings to allow buffering of multiple updates in more unstable network conditions)
Edit: Then client side prediction is layered on top of this to make user-controlled objects feel more responsive.
Edit2: Even though Colyseus uses TCP on the client side, it still could be beneficial to use interpolation on the client side
(with only one buffered update, as multiple buffered updates won't really accomplish anything on TCP) as otherwise the enemies would get stuck in one place on the screen for waiting for the next update. There's also a case for using dead reckoning / extrapolation, but it has issues as well.