2

我正在尝试了解如何正确使用 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文件中,我导入了 lodashrequire并在模块上公开了一个函数,我在index.ts文件中使用了该函数。

模块.ts

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

import _ = require('lodash');

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

索引.ts

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

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

问题是tsc(所以 VS Code)告诉我它找不到 name FooModule

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

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

我做错了什么require吗?

4

1 回答 1

2

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

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

举个例子:

模块.ts

import _ = require('lodash');

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

如果您从外部模块导出内部模块,则功能foo现在有效:module.FooModule.fooFooModulemodule

export module FooModule {
    // ...
}

但是,这很糟糕

于 2016-02-25T11:18:44.503 回答