Typing adds constraints - the type must be represented by and implemented in a particular type system. A trivial anti-modular constraint is that interacting modules must all use the same type system. The type system matters too - in Java, choosing from easily implementable types can easily add a lot to the complexity of the data structure, leading to a complex interface (in a more expressive type system, less of this happens).
More trivially, adding types IS adding constraints that are verifiable at compile time.
If compile-time verification of that sort is not essential (or not desired, which is the more general form of not essential), then the constraints are non-essential (or not desired).
---
Whether you choose to
1. Choose a particular data-structure and implement both modules to pass and receive that data-structure.
2. Specify an interface: The interface requires the data-structure to have certain properties (e.g. some methods work on them). The modules then build to the interface.
3. Specify that an adaptor exist to convert the data-structure to whatever the module requires.
is a somewhat different issue, although the kind of type system used does affect the implementation complexity and effort required.
More trivially, adding types IS adding constraints that are verifiable at compile time.
If compile-time verification of that sort is not essential (or not desired, which is the more general form of not essential), then the constraints are non-essential (or not desired).
---
Whether you choose to
1. Choose a particular data-structure and implement both modules to pass and receive that data-structure.
2. Specify an interface: The interface requires the data-structure to have certain properties (e.g. some methods work on them). The modules then build to the interface.
3. Specify that an adaptor exist to convert the data-structure to whatever the module requires.
is a somewhat different issue, although the kind of type system used does affect the implementation complexity and effort required.