The idea of having a type defined by it'sits interface (in a general meaning, including syntax and semantics) is well known under the name Abstract Data Type. The oldest reference to this term I could find is here, ("Programming with Abstract Data Types", B. Liskov and S. Zilles), it refers back to 1974. According to this paper, which contains a full historic overview, that was exactly the time when the idea of type abstraction was invented.
The ADT concept has not much to do with "duck typing" or "dynamic typing". You can implement ADTs easily in a statically typed language like, for example, C++ by utilizing classes.