Typescript 如何重新声明socket.io客户端API类型以实现额外的类型安全性

Typescript 如何重新声明socket.io客户端API类型以实现额外的类型安全性,typescript,socket.io,es6-modules,Typescript,Socket.io,Es6 Modules,我正在试验socket.io和TypeScript。我试图实现的是在客户端为socket.on函数及其回调提供一些额外的类型安全性 例如,在我的服务器代码中,我发出以下消息: socket.emit('timer', new Date()) 现在在我的客户机代码中: socket.on('timer', callback); 我希望编译器理解回调函数只接受一个Date类型的参数 为此,我发现我可以使用一些重载重新声明socket.io客户机类型声明。因此,我在我的自定义套接字io.d.ts文

我正在试验socket.io和TypeScript。我试图实现的是在客户端为
socket.on
函数及其回调提供一些额外的类型安全性

例如,在我的服务器代码中,我发出以下消息:

socket.emit('timer', new Date())
现在在我的客户机代码中:

socket.on('timer', callback);
我希望编译器理解回调函数只接受一个Date类型的参数

为此,我发现我可以使用一些重载重新声明
socket.io客户机
类型声明。因此,我在我的
自定义套接字io.d.ts
文件中尝试了以下操作:

import 'socket.io-client';
declare module 'socket.io-client' {
  declare namespace SocketIOClient {
    interface Emitter {
      on(event: 'timer', fn: (timestamp: Date) => void): Socket;
    }
  }
}
但它不起作用

如果我将其声明为全局而非模块,则一切正常:

import 'socket.io-client';
declare global {
  namespace SocketIOClient {
    interface Emitter {
      on(event: 'timer', fn: (timestamp: Date) => void): Socket;
    }
  }
}
但这似乎很老套。如何通过模块声明实现这一点