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 环境中不起作用