Indeed, type systems are domain-specific languages, that run at compile time or runtime, and specify constraints about values.
Most of them can be coerced to do general computation, especially if they have things like if-branch, and some sort of self-reference.