Node.js 用于打字的TypeScript外部节点模块声明文件
我有一个Node.js模块(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
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...
仍然抛出相同的错误。我想我找到了有效的解决方案,我会更新我的问题。仍然会抛出相同的错误。我想我找到了有效的解决方案,我会更新我的问题。