I was just explaining my take to a coworker yesterday!
Basically, interfaces are useful for mandating certain behavior in an application, or for having multiple implementations of the same behavior. Any “data” (properties) in an interface are really just a manifestation of behavior, rather than actual data itself. So use an interface when you expect to “call” an object and be returned as result. Additionally, interfaces can be used to ensure that classes conform to the contract, and a compiler error will be thrown if the contract changes and the implementations do not update to handle the new api.
In contrast, data classes should be the opposite, just data and (ideally) no behavior. You shouldn’t really do much to the object itself other than pass it from one place to another. They are good for packing data, serializing it, passing it around, copying/manipulating it, etc. But you cannot guarantee that a given class will use all the fields of the data class passed to it correctly, so they cannot reliably mandate any kind of behavior.