TypeScript supports Node's ECMAScript module resolution with the node16 and nodenext module and moduleResolution options. It's not clear if I must use Node 16 or greater to use either option. Node 14 has support for ESM and not much changed between 14 and 16. Experimentally TypeScript works as expected with Node 14 and nodenext but maybe there are edge cases that I'm not aware of.