Use the globally-defined XSD datatypes as much as you can; don't reach for custom literals unless you really need them.
If your strings are identifiers that have a URI format, use the URI primitive type instead. Or, if your strings just encode values from a fixed set of options, you should use enums instead. In general, unless your strings feel like arbitrary text, you should try to tease out as much of their structure into the type level as possible.
If the two states of a boolean have natural names in a namespace, consider replacing them with a binary enum instead.
For example, rewriting
namespace ex http://example.com/ class ex:IssueTicket { ex:closed -> boolean }
into
namespace ex http://example.com/ class ex:IssueTicket { ex:status -> [ ex:open ex:closed ] }
is much clearer.
If you have data that is semi-structured, inconsistent, heterogenous, or too awkward to model well with tasl (e.g. an array of numbers where the order is significant), use the JSON
literal type as an escape hatch.
One of the most noticeable things about tasl is that there is not array or list type. This might feel natural by comparison to relational databases, or unnatural by comparison to binary serialization formats like Protobuf.
If you're struggling to model lists or arrays in tasl, ask yourself these questions (in order of importance)
ex:index -> nonNegativeInteger
component to a multi-valued property class.