【问题标题】:socket.io Typescript fails to create a server, "This expression is not callable"socket.io Typescript 无法创建服务器,“此表达式不可调用”
【发布时间】:2021-05-17 00:58:45
【问题描述】:

我有以下代码(服务器):

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}`);
});

但我在const io = socketio(server); 上收到错误消息,它指出:

此表达式不可调用。键入'类型 import("SOME_PATH/node_modules/socket.io/dist/index")' 没有调用 签名

这到底是什么问题?

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"
  }

【问题讨论】:

  • 看起来socket.io 提供了自己的类型,但这些缺少默认的导出工厂。我要么打开一个issue,要么弄清楚如何告诉 TypeScript 不要使用来自 node_modules/socket.io 的类型,而是使用来自 node_modules/@types/socket.io 的类型。
  • 你检查所有类型都安装了吗?试试npm i 确定

标签: node.js typescript types socket.io


【解决方案1】:

第3版api改了,这个issuehere有一些讨论。

你的例子的新等价物是

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}`);
});

附带说明一下,socket.io 是用 typescript 重写的,因此您不再需要 @types/socket.io。

【讨论】:

    【解决方案2】:

    对此不确定,但问题似乎在于 socket.io 描述其自己的默认导出的方式。

    我通过将其转换为 as any

    解决了这个问题
        import io from 'socket.io';
        const server = (io as any)(http);
    

    【讨论】:

      猜你喜欢
      • 2021-06-12
      • 2020-08-16
      • 2021-04-27
      • 2021-02-12
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      • 2013-12-04
      相关资源
      最近更新 更多