TypeScript icon indicating copy to clipboard operation
TypeScript copied to clipboard

require() is generated in JS although there's no runtime code

Open Llorx opened this issue 10 months ago • 5 comments

🔎 Search Terms

require generated const enum namespace require generated namespace require const enum namespace require "export import" require

⏯ Playground Link

Multiple files, so can't use playground

💻 Code

// file1.ts
export namespace MyOtherNamespace {
    export const enum Yay {
        OK,
        KO
    }
}
// file2.ts
import { MyOtherNamespace } from "./file1";
export namespace MyNamespace {
    export import NS2 = MyOtherNamespace;
}
import { MyNamespace } from "./file2.ts";

const val = MyNamespace.NS2.Yay.KO
// Compiled code
const file2_1 = require("./file2"); // notice the variable name which is just "filename_1", as it is not used anywhere
const val = 1;

🙁 Actual behavior

Compiling an unused const file2_1 = require("./file2"); line

🙂 Expected behavior

Do not compile unused line.

Additional information about the issue

The problem is that this file is a types file, so it is installed only in develpment environment (npm install -D xxx) so in runtime it is failing because it can't find the required module.

If I modify the MyNamespace namespace to directly export a namespace instead of doing an export import it works, but we have a lot of namespaces so we have them separated into files, and couldn't find another way to export an imported namespace inside another namespace.

Llorx avatar Mar 11 '25 08:03 Llorx

NOTE: Now I'm importing file1.ts directly to access to the const enum.

Llorx avatar Mar 11 '25 15:03 Llorx

For consistency, imports are generated if there's an apparent value reference, even if it's inlined at the end. You can use import type if you don't want this to appear.

RyanCavanaugh avatar Mar 14 '25 15:03 RyanCavanaugh

@RyanCavanaugh That doesn't work because it complains that you can't use a const enum in runtime when imprting using import type (although is a const enum).

Also, if I remove the "export import" and just add the namespace inline, this problem doesn't happen. It seems like a bug when using "export import" because that's the key difference that creates this problem.

Llorx avatar Mar 14 '25 19:03 Llorx

@Llorx what compiler options are you using?

andrewbranch avatar Mar 14 '25 19:03 andrewbranch

@andrewbranch This is my tsconfig:

{
    "compilerOptions": {
        "target": "es2020",
        "lib": ["esnext"],
        "module": "commonjs",
        "allowJs": true,
        "allowSyntheticDefaultImports": true,
        "moduleResolution": "node",
        "noImplicitAny": true,
        "strictNullChecks": true,
        "removeComments": true,
        "sourceMap": true,
        "esModuleInterop": true,
        "strictBindCallApply": true,
        "strictFunctionTypes": true,
        "outDir": "./lib"
    },
    "include": [
        "./src/index.ts"
    ]
}

Llorx avatar Mar 19 '25 14:03 Llorx