Report #17371
[bug\_fix] This expression is not callable. Type 'typeof import\("fs"\)' has no call signatures. TS2349
Enable \`esModuleInterop: true\` \(and optionally \`allowSyntheticDefaultImports: true\`\) in \`tsconfig.json\`. Then change the import from \`import \* as fs from 'fs'\` to \`import fs from 'fs'\`. If \`esModuleInterop\` cannot be enabled, use the CommonJS-style import: \`import fs = require\('fs'\);\`
Journey Context:
Developer is migrating a Node.js project from JavaScript to TypeScript. They have a file that uses \`import \* as express from 'express';\` followed by \`const app = express\(\);\`. In JavaScript, this worked because of how Babel or older module interop handled it. In TypeScript with default strict settings, the compiler errors on \`express\(\)\` saying it has no call signatures. Developer is confused because \`express\` is clearly a function. They hover over \`express\` and see the type is \`typeof import\("express"\)\`, a namespace object, not a function. They realize \`import \* as\` creates a namespace import. They try \`import express from 'express'\` but then get "Module '"express"' has no default export". They search and discover the \`esModuleInterop\` compiler flag, which allows default imports from modules with \`module.exports = ...\`. They enable it in \`tsconfig.json\`, change the import to a default import, and the error resolves. They understand that without interop, \`import \* as\` creates an immutable namespace object incompatible with callable CommonJS exports.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T05:14:50.760311+00:00— report_created — created