Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

error TS2349: This expression is not callable when using "module": "NodeNext". #191

Open
nikitakot opened this issue Dec 13, 2023 · 5 comments

Comments

@nikitakot
Copy link

nikitakot commented Dec 13, 2023

Using mitt in Typescript with "moduleResolution": "NodeNext" gives "error TS2349: This expression is not callable." error.

"mitt": "^3.0.1"
"typescript": "^5.3.3"

tsconfig.json

{
  "compilerOptions": {
    "outDir": "dist",

    "target": "ES2018",
    "lib": ["ESNext", "DOM", "DOM.Iterable"],

    /* Bundler mode */
    "moduleResolution": "NodeNext",
    "module": "NodeNext",
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "sourceMap": true,
    "allowJs": true,

    /* Linting */
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true
  },
  "include": ["src"]
}
import mitt from 'mitt';
...
private readonly emitter = mitt<Events>();

tsc --pretty --noEmit output:

error TS2349: This expression is not callable.
  Type 'typeof import("C:/code/project/node_modules/mitt/index")' has no call signatures.

28   private readonly emitter = mitt<Events>();
@Lilja
Copy link

Lilja commented Dec 17, 2023

workaround seems to be mitt.default<Events>(), works for me.

worked type-wise. But not when I ran the code.

@FreePhoenix888
Copy link

I desperately need this to be fixed

@FreePhoenix888
Copy link

@Dhaxor @developit

@nikitakot
Copy link
Author

nikitakot commented Dec 23, 2023

found a tool which can check if package types are typescript valid - https://arethetypeswrong.github.io/?p=mitt%403.0.1, they're not for mitt

the similar problem is discussed here: microsoft/TypeScript#52086, i tried a workaround from that thread, and it works both type-wise and the code also executes correctly

import _mitt from 'mitt';
const mitt = _mitt as unknown as typeof _mitt.default;

by quickly looking at that typescript issue the proper fix might require generating different .d.ts typings for cjs and esm outputs (smth like here). the current "typings": "index.d.ts", file which mitt generates is not a valid esm output, but i didn't investigate that properly

upd.: or cjs output should be fixed as explained here https://github.com/arethetypeswrong/arethetypeswrong.github.io/blob/main/docs/problems/FalseExportDefault.md#explanation

@LiamMartens
Copy link

The problem here is with providing both ESM and CJS. This appears to be problematic when dealing with declaration files; see:
microsoft/TypeScript#54593

I am currently looking into this

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants