The declaration-merging distinction is the one point here that actually explains why the interface-vs-type-alias debate exists, rather than just listing feature parity. Most explanations stop at "interfaces are for objects, types are for unions," but merging is the concrete case where they genuinely aren't interchangeable, a library augmenting a global interface (like extending Window or a third-party type) needs that behaviour, and no type alias can replicate it.
The type-narrowing section is worth its own follow-up post, honestly, the typeof check example is the simple case, but narrowing gets a lot more interesting (and more useful in practice) once you get into discriminated unions with a shared kind/type field, since that's usually how real API response shapes end up modeled rather than plain string | number.