You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fastify-CLI项目添加自定义Socket.io事件类型遇TS错误求助

解决fastify-socket.io自定义TypeScript类型冲突问题

问题说明

出现TS2717错误是因为fastify-socket.io已为FastifyInstance的io属性声明默认类型,直接重写该属性会触发重复声明冲突,错误信息如下:

Subsequent property declarations must have the same type.  Property 'io' must be of type 
'Server<DefaultEventsMap, DefaultEventsMap, DefaultEventsMap, any>', but here has type 
'Server<ClientToServerEvents, ServerToClientEvents, DefaultEventsMap, any>'.ts(2717)

原代码:

// apps/server-socket/src/plugins/socket-io.ts

import { ClientToServerEvents, ServerToClientEvents } from "my-types"
import fp from "fastify-plugin"
import socketioServer from "fastify-socket.io"
import { Server } from "socket.io"

export default fp(async fastify => {
  fastify.register(socketioServer, {
    cors: { origin: process.env.WEB_URL, methods: ["GET", "POST"] },
  })
})

declare module "fastify" {
  export interface FastifyInstance {
    io: Server<ClientToServerEvents, ServerToClientEvents> // TS Error here
  }
}

解决方案

不要直接重写FastifyInstance的io属性,改为扩展fastify-socket.io提供的类型接口覆盖默认类型,避免冲突。修改后的代码如下:

// apps/server-socket/src/plugins/socket-io.ts

import { ClientToServerEvents, ServerToClientEvents } from "my-types"
import fp from "fastify-plugin"
import socketioServer from "@fastify/socket.io" // 推荐使用官方维护的@fastify/socket.io包
import { Server } from "socket.io"

// 扩展@fastify/socket.io的类型接口,自定义io的事件类型
declare module "@fastify/socket.io" {
  interface FastifySocketIO {
    io: Server<ClientToServerEvents, ServerToClientEvents>;
  }
}

export default fp(async fastify => {
  fastify.register(socketioServer, {
    cors: { origin: process.env.WEB_URL, methods: ["GET", "POST"] },
  })
})

补充提示

  • 若仍在使用旧包fastify-socket.io,建议迁移至@fastify/socket.io,前者已被官方弃用,两者类型扩展逻辑一致。
  • 该方式通过TypeScript模块合并机制扩展类型,不会与原有属性声明冲突,自动合并自定义类型与默认类型。

内容的提问来源于stack exchange,提问作者Nadji Tan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 04:12:34