Node.js 用于打字的TypeScript外部节点模块声明文件

Node.js 用于打字的TypeScript外部节点模块声明文件,node.js,module,typescript,commonjs,typing,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.defineProper

我有一个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
声明文件,并在我的
package.json
中的
typings
字段中引用它。而且,这个声明文件必须是一个模块。因此,在阅读了几篇关于此主题的教程后,我的第一个方法是:

// 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模块

export const fileContent: string;
export default fileContent;
这对我来说是可行的,但是我感觉不对,因为我没有找到任何
.d.ts
示例文件没有使用
declare
内容。我还注意到,我不应该在名称空间/模块中使用
导出默认值
,这导致我完全不理解如何声明模块的默认导出

以下是我的问题:

  • 我该怎么做才对呢
  • 如何确保TypeScript识别
    default
    属性
  • 我需要使用
    声明模块
  • 我需要声明导入(
    fs
    path
    )吗

编辑:

经过更多的研究和努力,我想我自己已经找到了解决办法。据我所知,外部模块描述/声明必须是一个模块,这意味着它必须导入或导出某些内容:在这种情况下,它还必须导出声明和声明的常量作为默认导出:

export declare const fileContent: string;
export default fileContent;

错误TS2656:。。。不是模块
在尝试使用ES6样式导入且定义不导出模块时发生

我建议把你的定义改为

declare module MyModule {
    export const fileContent: string;
}

declare module "my-module" {
    export default MyModule
}
由于此定义现在是“默认导出”模块,因此可以使用默认ES6导入语法导入它

import MyModule from "my-module"
然后使用它

MyModule.fileContent...

错误TS2656:。。。不是模块
在尝试使用ES6样式导入且定义不导出模块时发生

我建议把你的定义改为

declare module MyModule {
    export const fileContent: string;
}

declare module "my-module" {
    export default MyModule
}
由于此定义现在是“默认导出”模块,因此可以使用默认ES6导入语法导入它

import MyModule from "my-module"
然后使用它

MyModule.fileContent...

仍然抛出相同的错误。我想我找到了有效的解决方案,我会更新我的问题。仍然会抛出相同的错误。我想我找到了有效的解决方案,我会更新我的问题。