As such, it was decided that the way to recognize a Promise (or something that behaves like a Promise) would be to define something called a "thenable" as any object or function which has a then(..) method on it. It is assumed that any such value is a Promise-conforming thenable.
—https://github.com/getify/You-Dont-Know-JS/blob/master/async%20%26%20performance/ch3.md