developit / mitt

🥊 Tiny 200 byte functional event emitter / pubsub.
https://npm.im/mitt
MIT License
10.67k stars 435 forks source link

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

Open nikitakot opened 8 months ago

nikitakot commented 8 months ago

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 commented 8 months ago

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

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

FreePhoenix888 commented 8 months ago

I desperately need this to be fixed

FreePhoenix888 commented 8 months ago

@Dhaxor @developit

nikitakot commented 8 months ago

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: https://github.com/microsoft/TypeScript/issues/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 commented 8 months ago

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

I am currently looking into this