Почему Typescript считает аргумент функции корректным?
Тайпскрипт использует структурную типизацию, а не номинативную.
Это значит, что он смотрит не на имена типов, а на их содержимое-структуру.
И вот по структуре Invalid user расширяет Valid user.

Побороться с этим можно, если ввести какую-нибудь несовместимость между этими интерфейсами.
Например добавив поле type с некоторым константным строковым знаяением
А почему нет? Попробуйте передать в функцию не переменную, а сам объект - увидите разницу.
https://www.typescriptlang.org/play?#code/JYOwLgpg...

