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

TypeScript中导入声明与本地ApiService声明冲突(TS2440)如何解决?

修复TS2440:Import declaration conflicts with local declaration of ApiService

这个错误的根源很直接:你在同一个文件里既从./src/ApiService导入了真实的ApiService类,又手动声明了同名的类类型——TypeScript完全搞不清你到底要使用哪个ApiService,所以抛出了冲突错误。

类型定义文件(.d.ts)的核心作用是描述已存在的JavaScript代码的类型,而不是重复定义一个与原代码同名的实体。下面是两种最常用的修复方案:

方案1:直接声明类型,不导入原JS模块

删掉开头的import语句,直接在.d.ts文件里声明ApiService的类型即可:

// 比如命名为 api-service.d.ts
export declare class ApiService {
  constructor(adapter: any, options: any);
  // 这里可以把类型写得更具体,避免any(可选优化)
  on(evt: string, cb: (...args: unknown[]) => void): any;
  extend(opts: Record<string, unknown>): any;
}

之后在业务代码里导入ApiService时,TypeScript会自动关联这个类型定义,不会再有冲突。

方案2:使用declare module包裹类型(推荐给模块写类型)

如果你的ApiService是一个独立模块导出的,更规范的做法是用declare module将类型与对应模块绑定:

// 放在 src/ApiService.d.ts 中
declare module './ApiService' {
  export class ApiService {
    constructor(adapter: any, options: any);
    on(evt: string, cb: (...args: any[]) => void): any;
    extend(opts: any): any;
  }
}

这种写法会告诉TypeScript:“当导入./src/ApiService这个模块时,它的导出内容符合我这里声明的类型”。此时你在其他文件正常导入ApiService时,就会自动应用这个类型定义,完全不会有冲突问题。

额外提示

尽量避免在类型定义中使用any,可以根据实际业务场景替换成更具体的类型(比如adapter如果是某个HTTP适配器,就可以定义对应的接口类型),这样能最大化发挥TypeScript的类型检查能力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:00:28