mitt icon indicating copy to clipboard operation
mitt copied to clipboard

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

Open nikitakot opened this issue 1 year ago • 5 comments

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>();

nikitakot avatar Dec 13 '23 14:12 nikitakot

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

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

Lilja avatar Dec 17 '23 16:12 Lilja

I desperately need this to be fixed

FreePhoenix888 avatar Dec 23 '23 10:12 FreePhoenix888

@Dhaxor @developit

FreePhoenix888 avatar Dec 23 '23 10:12 FreePhoenix888

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

nikitakot avatar Dec 23 '23 11:12 nikitakot

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

LiamMartens avatar Jan 02 '24 14:01 LiamMartens