Type definitions are recursive by default – you can mention the type you are defining on the right-hand side of the definition.
type nonrec makes it non recursive, so in type nonrec t = t it looks for the t that is currently in scope not the one you are defining and the one that is scope is the one that came just before.
The opposite is true for values: let is not recursive by default, you have to use let rec if you want to use the name you are defining on the right-hand side.