socket.io Typescript 无法创建服务器,“此表达式不可调用”

Posted

技术标签:

【中文标题】socket.io Typescript 无法创建服务器,“此表达式不可调用”【英文标题】:socket.io Typescript fails to create a server, "This expression is not callable" 【发布时间】: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 确定 【参考方案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);

【讨论】:

以上是关于socket.io Typescript 无法创建服务器,“此表达式不可调用”的主要内容,如果未能解决你的问题,请参考以下文章

cocos creator 3.1 typescript sokcet-io

Express-session 和 express-socket.io-session 在 angular2 / typescript 环境中不起作用

无法创建到 Node.js socket.io 服务器的跨域 websocket 连接

无法获取 socket.io.js

Socket.io 无法在 ReactJS 应用程序中连接

Socket.io 无法连接,求助于“轮询”