【问题标题】:TypeScript cannot find module if it contains a require如果 TypeScript 包含 require 则找不到模块
【发布时间】:2016-06-08 01:01:15
【问题描述】:

我正在尝试了解如何正确使用 TypeScript 和经典 JS 节点模块。

我建立了一个非常基础的项目,文件架构如下:

.
├── index.ts
├── lodash.d.ts
├── module.ts
└── node_modules
    └── lodash

lodash 已与npm 一起安装。由于它似乎没有提供任何类型信息,我写了一个基本的d.ts 文件,它只描述了一个功能,只是为了取悦tsc 并避免不知道lodash 的错误。

lodash.d.ts

declare module "lodash" {
  export function reverse(array: any[]): any[];
}

在我的module.ts 文件中,我使用require 导入lodash,并在模块上公开一个函数,我在index.ts 文件上使用该函数。

module.ts

/// <reference path="./lodash.d.ts" />

import _ = require('lodash');

module FooModule {
  export function foo() {
    return _.reverse([1, 2, 3]);
  }
}

index.ts

/// <reference path="./module.ts" />

let a = FooModule.foo();
console.log(a);

问题是tsc(以及VS Code)告诉我它找不到名称FooModule

$ tsc index.ts --module commonjs -outDir build
index.ts(3,9): error TS2304: Cannot find name 'FooModule'.

但是,如果我从module.ts 中删除import _ = require('lodash');,它可以正常工作(除了_ 变量现在未定义的明显事实)。

我对这个require 做错了吗?

【问题讨论】:

    标签: typescript typescript1.8


    【解决方案1】:

    您正在混合内部模块和外部模块。如果您在.ts 文件中使用顶级导入或导出语句,则文件本身会自动被视为外部模块,其内容都是该模块的一部分(require 是一个导入声明)。

    如果你将一个内部模块放在一个外部模块中(modulenamespace 关键字),你实际上是在双重包装你的模块内容。这不好。

    举个例子:

    module.ts

    import _ = require('lodash');
    
    module FooModule {
        export function foo() {
            return _.reverse([1, 2, 3]);
        }
    }
    

    如果你从外部模块module导出内部模块FooModule,函数foo现在实际上是module.FooModule.foo

    export module FooModule {
        // ...
    }
    

    但是,这不好

    【讨论】:

    • 我明白了,感谢您的清晰解释。但是,如果像您在答案末尾建议的那样导出FooModule 是不好的做法,那么干净的方法是什么?或者,如果这是一个架构问题,我应该如何在我想在项目中公开的部分代码上使用节点模块?
    • @Blackus 只需删除 module FooModule 部分,并让您的函数保持开放状态。它们将是模块module 的一部分(或任何您的文件命名,没有.ts 扩展名)。另外,不要忘记运行时需要一个模块加载系统(Node.js 已内置)。
    • 我终于明白了,它就像 CommonJS 模块一样工作(在这种情况下)。首先实际上愚弄了我很多的是我的构建方式(我在我的真实项目中使用 webpack)是不正确的,并且我的所有文件都没有正确重建。现在一切都清楚了。再次感谢:)
    猜你喜欢
    • 2019-05-21
    • 2017-10-11
    • 2016-03-15
    • 2016-08-23
    • 2020-10-30
    • 2019-08-16
    • 2016-09-20
    • 2021-10-27
    • 2016-10-24
    相关资源
    最近更新 更多