Bug Report
TypeScript 4.7 RC introduces the "module": "node16" setting. When used, this requires users to use the .js extension in import paths. I strongly believe this to be a mistake and TypeScript should instead allow users to use the .ts/.tsx extension of the source file. It would then be the TS compiler’s responsibility to rewrite this to the output file as necessary.
I have several reasons for requesting this change:
- The file with the
.js extension most likely does not exist on disk. It may exist on disk if a build has been created and the output is placed right alongside the sources (not a common configuration), but otherwise the file is simply not there or in a different place than one might expect. This is confusing to users, because they need to manually consider how output files are created.
- Using the
.js extension makes the source code less portable for full-stack projects. If a user wants to use the same sources for a frontend project that uses a bundler, they will be out of luck. A bundler would be able to understand a reference to the .ts file (because that one actually exists on disk!), but would struggle with references to files that do not exist for its configuration.
- Using the
.js extension makes the source incompatible with Deno projects, as they use the .ts/.tsx extensions, because those are the ones that actually exist.
- Using the
.js extension is inconsistent with type import. Does import type { MyType } from “./myFile.js” even work? It would not make sense because the JS file contains no types. But if it doesn’t work, does that mean I still have to use the .ts extensions only for the types? That would be highly annoying.
🔎 Search Terms
extension rewriting esm module
🕗 Version & Regression Information
TypeScript 4.7. RC1
- I was unable to test this on prior versions because the feature is new to version 4.7.
🙁 Actual behavior
I am forced to write import { myFunction, type MyType } from “./myFile.js” despite “./myFile.js” not being a valid path in my project.
🙂 Expected behavior
I should be able to write import { myFunction, type MyType } from “./myFile.ts” because “./myFile.ts” is the actual file I am referring to. Upon compilation I would expect TypeScript to rewrite the path so the output works correctly too.
Bug Report
TypeScript 4.7 RC introduces the
"module": "node16"setting. When used, this requires users to use the.jsextension in import paths. I strongly believe this to be a mistake and TypeScript should instead allow users to use the.ts/.tsxextension of the source file. It would then be the TS compiler’s responsibility to rewrite this to the output file as necessary.I have several reasons for requesting this change:
.jsextension most likely does not exist on disk. It may exist on disk if a build has been created and the output is placed right alongside the sources (not a common configuration), but otherwise the file is simply not there or in a different place than one might expect. This is confusing to users, because they need to manually consider how output files are created..jsextension makes the source code less portable for full-stack projects. If a user wants to use the same sources for a frontend project that uses a bundler, they will be out of luck. A bundler would be able to understand a reference to the.tsfile (because that one actually exists on disk!), but would struggle with references to files that do not exist for its configuration..jsextension makes the source incompatible with Deno projects, as they use the.ts/.tsxextensions, because those are the ones that actually exist..jsextension is inconsistent with type import. Doesimport type { MyType } from “./myFile.js”even work? It would not make sense because the JS file contains no types. But if it doesn’t work, does that mean I still have to use the.tsextensions only for the types? That would be highly annoying.🔎 Search Terms
extension rewriting esm module
🕗 Version & Regression Information
TypeScript 4.7. RC1
🙁 Actual behavior
I am forced to write
import { myFunction, type MyType } from “./myFile.js”despite “./myFile.js” not being a valid path in my project.🙂 Expected behavior
I should be able to write
import { myFunction, type MyType } from “./myFile.ts”because “./myFile.ts” is the actual file I am referring to. Upon compilation I would expect TypeScript to rewrite the path so the output works correctly too.