我正在尝试了解如何正确使用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代码)告诉我它找不到名称FooModule
。
$ tsc index.ts --module commonjs -outDir build
index.ts(3,9): error TS2304: Cannot find name 'FooModule'.
但是,如果我从import _ = require('lodash');
中移除module.ts
,它就会正常工作(除了_
变量现在未定义的明显事实。)
我对此require
做错了吗?
答案 0 :(得分:1)
您正在混合内部模块和外部模块。如果在.ts
文件中使用顶级导入或导出语句,则文件本身将自动视为外部模块,其内容都是该模块的所有部分({{1}是导入语句。)
如果将内部模块放在外部模块(require
或module
关键字)中,则实际上是对模块内容进行双重包装。那不好。
采用以下示例:
<强> module.ts 强>
namespace
如果您从外部模块import _ = require('lodash');
module FooModule {
export function foo() {
return _.reverse([1, 2, 3]);
}
}
导出内部模块foo
,则功能module.FooModule.foo
现在有效FooModule
:
module
然而,这是坏。