It's true that there are valid programs which don't type check in the same way that for any mathematical system there are truths which can't be proven.
In practice though, almost any program you'd want to write can be type checked, in the same way that few proofs get tied into Gödelian knots.
True, but there is a difference between "can be type checked" and "can be type checked in a reasonable amount of time".
I get reminded of this everything I have to work with a certain large Typescript code-base of mine that makes heavy use of union and template literal types. The Typescript Language Server has a hard time with these types. Frequently, everything slows to a crawl in VSCode, and it take 10 minutes of more for intellisense to update after every type change, ouch.
Although in this case, I suspect it is Typescript's implementation of union types that is to blame (since other languages seem to handle complex union types with ease), this experience still shows that type checking can become quite expensive.
In practice though, almost any program you'd want to write can be type checked, in the same way that few proofs get tied into Gödelian knots.