You can overcome drawbacks of structural typing in TypeScript by creating nominal types with a little bit of extra code.
If the type is shaped like a duck, it is a duck. If a goose has all the same attributes as a duck, then it also is a duck.
The key distinction is that a type cannot be re-opened to add new properties vs an interface which is always extendable.
Are you still skeptical about TypeScript? If that's the case then this post will help you make an informed decision.
Redux open-source repository is one of the most beautiful well-documented beginner-friendly TypeScript codebase.