One way to completely avoid syntax is to use [Ehrenfeucht–Fraïssé games](http://en.wikipedia.org/wiki/Ehrenfeucht%E2%80%93Fra%C3%AFss%C3%A9_game). If $\mathfrak{A}$ and $\mathfrak{B}$ are two structures with the same signature, then two $k$-tuples $\bar{a}$ and $\bar{b}$ from these respective structures satisfy the same type if and only if duplicator wins every finite length EF game between $(\mathfrak{A},\bar{a})$ and $(\mathfrak{B},\bar{b})$. This is a perfectly semantical way of defining the space $S_k$ of $k$-types for a given signature. One can show directly that the resulting space $S_k$ is a compact zero-dimensional space.  The $k$-ary formulas of the language basically correspond to clopen sets in $S_k$. The compactness of $S_0$ is basically a restatement of the Compactness Theorem. Similarly, the Omitting Types Theorem is basically a restatement of the Baire Category Theorem for these spaces $S_k$.

This is the approach used by the Fraïssé school of model theory. One recent book which tries to promote this approach is Bruno Poizat's *A Course in Model Theory*.