Huh? You would just overload the method then in another language. That is a lot safer than manually checking the argument type inside the method with the hack you proposed.
You're right if by "more expressive" you meant "not really safe at all". By using the types of hacks you proposed, you end up losing type information and safety guarantees. So why bother using Typescript in the first place then? Your example is the perfect argument against Typescript.
If you were referring to generic types, then there's no good reason to do that in the first place. Use a base type. Polymorphism 101. Anything else would be duck typing, and not safe.
There's no middle ground with type safety: it is either safe or not. And if there's a chance it's not, then you've lost and all of your efforts are pointless without resorting to manual checks.
And if you were somehow referring to C++ like templating (unlikely), then Typescript doesn't support that anyway.