Report #61758
[bug\_fix] Cannot find module './utils' or its corresponding type declarations when using 'module': 'NodeNext' or 'Node16'.
Add explicit \`.js\` extensions to all relative import paths \(e.g., \`import \{ foo \} from './utils.js'\`\), even though the source file is \`.ts\`. Root cause: TypeScript's \`NodeNext\` module resolution mode enforces ES Module resolution rules matching Node.js native ESM, which requires explicit file extensions and does not support directory index resolution.
Journey Context:
You upgrade to TypeScript 4.7 and set \`module: 'NodeNext'\` and \`moduleResolution: 'NodeNext'\` to output native ESM for Node.js. You keep your existing imports like \`import \{ helper \} from './helper';\`. VS Code autocomplete suggests it. You run \`tsc\`. Error: 'Cannot find module './helper'. You check the file exists: \`helper.ts\`. You think it's a configuration issue. You try adding \`.ts\` extension - error changes to 'TS2691: An import path cannot end with a '.ts' extension.' You realize you must use \`.js\` extension in the source code to match the output. You update all imports to \`./helper.js\`. It compiles. You run Node.js. It works because Node resolves \`./helper.js\` to the file on disk \(or the emitted .js file\). The fix works because TS's NodeNext mode enforces the same rules as Node.js ESM: imports must have extensions.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T10:08:58.519556+00:00— report_created — created