用于输入的TypeScript外部节点模块声明文件

时间:2016-05-20 11:26:17

标签: node.js module typescript commonjs typing

我有一个Node.js模块(index.js)已经使用Babel转换为代码,如下所示:

// My stuff ...
var fs = require("fs");
var path = require("path");

exports.fileContent = fs.readFileSync(
  path.join(__dirname, "file.txt"),
  'utf8'
);

// Babel compiler stuff ...
Object.defineProperty(
  exports,
  "__esModule",
  { value: true }
);

// My stuff again ...
exports.default = exports.fileContent;

Node.js中的用法是:

var myModule = require("my-module");

doSomethingWithIt( myModule.fileContent );

据我了解,我需要创建一个.d.ts声明文件,并在我typings的{​​{1}}字段中引用它。此外,此声明文件必须是一个模块。所以我在阅读了几个关于这个主题的教程后的第一个方法是:

package.json

但遗憾的是,这是一次失败:

// index.d.ts

declare module "my-module" {
  export const fileContent: string;
  export default fileContent;
}

我的下一个方法是摆脱[...] error TS2656: Exported external package typings file 'index.d.ts' is not a module. [...] 的事情:

declare module

这对我有用,但是感觉不对,因为我找不到任何export const fileContent: string; export default fileContent; 示例文件没有使用.d.ts的东西。我还注意到我不应该在命名空间/模块中使用declare,这导致我无法理解如何声明模块的默认导出。

以下是我的问题:

  • 我如何以正确的方式做到这一点?
  • 如何确保TypeScript识别export default属性?
  • 我是否需要使用default内容?
  • 我是否需要声明导入(declare modulefs)?

修改

经过一番研究和调整后,我想我已经找到了解决方案。据我所知,外部模块描述/声明必须是一个模块 - 这意味着它必须导入或导出一些东西:在这种情况下,它必须将声明和声明的常量导出为默认导出:

path

1 个答案:

答案 0 :(得分:0)

尝试使用ES6样式导入时发生

error TS2656: ... is not a module,并且定义未导出模块。

我建议您将定义更改为

declare module MyModule {
    export const fileContent: string;
}

declare module "my-module" {
    export default MyModule
}

由于此定义现在是“默认导出”模块,因此可以使用默认的ES6导入语法导入

import MyModule from "my-module"

然后使用它

MyModule.fileContent...