10

I have the following code(server):

import express from "express";
import socketio from "socket.io";
import http from "http";

const app = express();
const server = http.createServer(app);
const io = socketio(server);

server.listen(process.env.port || 3000, () => {
  console.log(`App running on port ${process.env.port || 3000}`);
});

But i get an error on const io = socketio(server);, It states:

This expression is not callable. Type 'typeof import("SOME_PATH/node_modules/socket.io/dist/index")' has no call signatures

What exactly is the problem here?

package.json:

 "devDependencies": {
    "@types/express": "^4.17.11",
    "@types/node": "^14.14.27",
    "@types/socket.io": "^2.1.13",
    "nodemon": "^2.0.7",
    "ts-node": "^9.1.1"
  },
  "dependencies": {
    "express": "^4.17.1",
    "socket.io": "^3.1.1",
    "typescript": "^4.1.5"
  }
2
  • Looks like socket.io provides its own types, but these are missing the default export factory. I'd either open up an issue or figure out how to tell TypeScript to not use the types from node_modules/socket.io but fom node_modules/@types/socket.io. Commented Feb 13, 2021 at 14:18
  • Did you check that all types are installed? Try npm i to be sure Commented Feb 13, 2021 at 14:39

2 Answers 2

27

The api changed in version 3. This issue here has some discussion.

The new equivalent of your example would be

import express from "express";
import { Server } from "socket.io";
import http from "http";

const app = express();
const server = http.createServer(app);
const io = new Server(server);

server.listen(process.env.port || 3000, () => {
  console.log(`App running on port ${process.env.port || 3000}`);
});

As a side note, socket.io was rewritten in typescript, so you no longer need to have @types/socket.io.

Sign up to request clarification or add additional context in comments.

Comments

1

Not sure about that, but the problem seems to be in the way socket.io describe its own default export.

I solved this by casting it as any

    import io from 'socket.io';
    const server = (io as any)(http);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.