Repository navigation
error importing type from esm in commonjsΒ #47338
Description
Activity
- addedNeeds InvestigationThis issue needs a team member to investigate its status.This issue needs a team member to investigate its status.
on Jan 12, 2022 So, my thoughts on this, since there have been a few issues in this vein (eg, #47248) and while I've spoken to them in team settings, I have yet to set them down.
This is technically working as expected right now, since you're importing an esm format files from a cjs one using constructs that check runtime behavior. You may think, "But Wesley Wigham (@weswigham), I'm only importing the types, surely that means it's safe to just give me the type data, right!?!? There's no runtime to be concerned about!" And you'd be right, but only in the narrowest sense - if we were to allow pulling types from modules whose format is incompatible like this, it becomes a breaking change to then add a compatible format to that package, rather than a non-breaking one. Meaning we'd be making adding more format compatibility via conditional
exportsa breaking change, which defeats a core premise of conditional exports.Therefore, I would not expect us to ever make the above work as written; instead, I would anticipate us adding a syntax to specifically get the esm or cjs format type information for a specifier even when that's not the default mode for the file's imports (like how you have dynamic import available in a cjs context to do esm resolution). Something like
import("dependency", { assert: { mode: "esm" } }).Color,import type { Color } from "dependency" assert { mode: "esm" }or similar. Incredibly verbose, but one of the only ways I can think to do it without inadvertently introducing refactoring hazards or introducing bespoke syntax.So, my thoughts on this, since there have been a few issues in this vein (eg, #47248) and while I've spoken to them in team settings, I have yet to set them down.
This is technically working as expected right now, since you're importing an esm format files from a cjs one using constructs that check runtime behavior. You may think, "But Wesley Wigham (@weswigham), I'm only importing the types, surely that means it's safe to just give me the type data, right!?!? There's no runtime to be concerned about!" And you'd be right, but only in the narrowest sense - if we were to allow pulling types from modules whose format is incompatible like this, it becomes a breaking change to then add a compatible format to that package, rather than a non-breaking one. Meaning we'd be making adding more format compatibility via conditional
exportsa breaking change, which defeats a core premise of conditional exports.Therefore, I would not expect us to ever make the above work as written; instead, I would anticipate us adding a syntax to specifically get the esm or cjs format type information for a specifier even when that's not the default mode for the file's imports (like how you have dynamic import available in a cjs context to do esm resolution). Something like
import("dependency", { assert: { mode: "esm" } }).Color,import type { Color } from "dependency" assert { mode: "esm" }or similar. Incredibly verbose, but one of the only ways I can think to do it without inadvertently introducing refactoring hazards or introducing bespoke syntax.makes sense. Thanks for looking into it
- addedFix AvailableA PR has been opened for this issueA PR has been opened for this issue
on Feb 8, 2022
Bug Report
π Search Terms
typeof import
import esm type from commonjs module
node12 nodenext
π Version & Regression Information
"module": "node12"only works intypescript@nextβ― Playground Link
I was unable to find a way to emulate
"type": "commonjs"inpackage.jsonon typescript playgroundhere is a repo that can be used to reproduce this error
https://github.com/nstringham/min-to-reproduce-typescript-import-problem
π» Code
/tsconfig.json
{ "compilerOptions": { "module": "nodenext" } }/dependency/index.d.ts
/index.ts
π Actual behavior
code compiles correctly but displays the following error
π Expected behavior
code compiles correctly with no errors
βͺοΈ Workaround
because typescript compiles correctly despite errors this error can be ignored with
// @ts-ignore