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

如何为名称含@的模块编写TypeScript类型声明?

嘿,我之前也处理过这种带@命名空间的模块类型声明问题,其实思路和普通模块一致,只是要注意模块名的完整写法。下面给你详细拆解几种可行的方案:

声明带@命名空间模块的正确姿势

1. 快速兜底声明(先解决报错)

如果只是想让TypeScript不再抛出“找不到模块”的错误,先快速做一个兜底声明就行。注意模块名要完整放在引号里,包括@和斜杠:

// 比如放在 src/types/@absinthe/socket.d.ts
declare module '@absinthe/socket' {
  // 先用any类型兜底,后续再补具体类型
  const AbsintheSocket: any;
  export default AbsintheSocket;
  // 如果有其他导出,也可以用export * from ... 或者单独声明
}

2. 完整类型定义(推荐)

如果要给模块写具体的类型,就按照它实际的导出结构来定义。比如假设@absinthe/socket导出了create函数和Socket类,你可以这样写:

// src/types/@absinthe/socket.d.ts
declare module '@absinthe/socket' {
  // 先定义需要的接口
  export interface SocketConfig {
    url: string;
    timeout?: number;
  }

  // 定义类类型
  export class Socket {
    constructor(config: SocketConfig);
    send(payload: Record<string, any>): Promise<unknown>;
    disconnect(): void;
  }

  // 导出函数
  export function create(config: SocketConfig): Socket;
}

这样在导入使用时,TypeScript就能自动提示类型校验了:

import { create } from '@absinthe/socket';
const socket = create({ url: 'ws://your-api.com' }); // TS会自动校验参数

3. 处理自定义分支/私有包的情况

如果这个包是热门包的自定义分支(比如你fork了原包做了修改),可以这样处理:

  • 先找原包的官方类型:比如@absinthe/socket对应的官方类型包是@types/absinthe__socket(注意把斜杠换成双下划线,这是@types包的命名规则)
  • 把官方类型文件复制到你的项目本地,然后根据自定义分支的改动调整类型
  • 同样用declare module '@absinthe/socket'包裹修改后的类型,这样TypeScript会优先使用你本地的声明,而不是npm上的官方@types包

4. 确保TS能识别你的声明文件

最后别忘了在tsconfig.json里配置include,让编译器能找到你的.d.ts文件:

{
  "compilerOptions": {
    // 你的其他编译配置
  },
  "include": [
    "src/**/*",
    "src/types/**/*.d.ts" // 把你的类型声明文件路径加进来
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:42:42