isolatedModules doesn't respect enabled preserveConstEnum option what the project might be build with
See original GitHub issueSearch Terms
isolatedModules, preserveConstEnum, const enum
Suggestion
The compiler should respect/understand that the package/module was compiled with enabled preserveConstEnums
compiler option.
Use Cases
Let’s say we have a project written in TypeScript, which uses const enums.
The project uses them because the main const enum
’s advantage is inlining values instead of runtime accessing to the value.
In other hand the maintainers understand that const enums compiles in nothing in JS code, and that means that consumers can’t use a const enums in their JS code (in some cases in TS code either, see above). Thus, they decided to enable preserveConstEnums
compiler option to leave all const enums in JS code and allow consumers use them as well.
Up to this moment everything is good. But the next who appears on the stage is isolatedModules
(say hello to create-react-app
, webpack’s transpile-only mode, transpileModule
compiler’s API and so on). This compiler option is used to detect that imported module could be transpiler without compilation into JS code and everything will work well. One of checks for this option is that you don’t import const enums (error TS2748: Cannot access ambient const enums when the '--isolatedModules' flag is provided
).
To summarize, if the project/package is compiled with enabled preserveConstEnums
, in isolatedModules
mode the compiler shouldn’t fail with error about unavailability of using const enums, because that’s not actually true.
Examples
Quite possible we need to provide that information to the compiler somehow (by providing tsconfig.export.json or in package.json for instance), but I don’t even know how it would be done.
Checklist
My suggestion meets these guidelines:
- This wouldn’t be a breaking change in existing TypeScript/JavaScript code
- This wouldn’t change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn’t a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, etc.)
- This feature would agree with the rest of TypeScript’s Design Goals.
Issue Analytics
- State:
- Created 3 years ago
- Reactions:4
- Comments:10 (5 by maintainers)
We’ve discussed this some in the past and I feel like I must be forgetting some of the complexities that came up. I just jotted down some straw-man proposals, and the simplest one feels fairly straightforward:
preserved
modifier for const enums--preserveConstEnums
.preserved
const enum can be imported and used under--isolatedModules
because its usage need not be inlined.preserved
const enums from node_modules / other projects / declaration files get inlined or not. (We’ve had some concerns before about inlining enum values from declaration files that could get out of sync with implementations, but I want to hear the case for that again before I’d be enthusiastic about adding a flag.)I tossed around another proposal combining @RyanCavanaugh’s original suggestion that const enums could be emitted to declaration files as regular enums with a compiler option
--inlineEnums
that could offer local control over what enums get inlined, but ultimately I think that level of control would be more confusing than useful. Part of our hesitation on doing anything about this is that enums are already confusing, so we want a solution to be as simple and explainable as possible.It seems like arguably
preserveConstEnum
should just emitenum
instead ofconst enum
to the.d.ts
, though I’m sure that would break some other scenario