【问题标题】:Cannot find namespace error找不到命名空间错误
【发布时间】:2016-03-02 09:39:14
【问题描述】:

我有以下设置:

// enums.ts
export enum DocumentType {
  Email = 0,
  Unknown = 1
}

-

// remote.ts
/// <reference path="./remote.d.ts" />
import enums = require('./enums');

class Remote implements test.IRemote {
  public docType: enums.DocumentType;

  constructor() {
    this.docType = enums.DocumentType.Unknown;
  }
}

export = Remote;

-

// remote.d.ts
import * as enums from './enums';


declare module test {
  export interface IRemote { 
    docType: enums.DocumentType;
  } 
}

但是当我对此运行 tsc 时,我会从 remotes.ts 获得Cannot find namespace 'test'。我错过了什么?

其他可能有用的信息:我最近从 Typescript 1.5 升级到 Typescript 1.8,并将 const 枚举替换为示例中的普通枚举。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您还需要从remote.d.ts 导出内部模块:

    remote.d.ts

    import * as enums from './enums';
    
    export declare module test {
        export interface IRemote { 
            docType: enums.DocumentType;
        } 
    }
    

    这是因为你有外部模块remote(当有顶级importexport语句时,文件本身就是模块),从中导出类型和其他符号时可用,很像 IRemote 是如何从模块 test 导出的。

    换句话说,您在外部模块中有一个内部模块,但内部模块没有导出。此外,IRemote 接口实际上是双重包装的,并且符合全名remote.test.IRemote


    注意:IMO,如果您不小心,将内部模块和外部模块混合在同一个项目中可能会导致许多问题和不便,因此应尽可能避免。

    【讨论】:

    • 如果我在 d.ts 中添加导出,我会得到同样的错误。如果我更改 remote.ts 以实现 remote.test.IRemote 我得到一个错误找不到命名空间'remote'
    • @AndrewJones 导入 remote.test 的语法是什么?
    • 我在 remote.ts 中,接口在 remote.d.ts 中定义,而不是 ///
    • @AndrewJones 我的意思是,你在哪里以及如何import 远程模块定义文件?
    • 好吧,我想我不是。所以你是在暗示我应该有类似的东西:@ 987654331@ 在remote.ts 中?我以为我只需要引用标签。
    【解决方案2】:

    在我的世界中,Cannot find namespace 错误是 CLI 服务的事情,在重新启动 npm watcher 后就会消失。

    【讨论】:

      猜你喜欢
      • 2017-02-15
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多