如何导出 TypeScript 模块以便可以从 TypeScript 和 Node 导入?
How to export a TypeScript module so that can be imported both from TypeScript and Node?
假设有以下 TypeScript 模块:
function foo () {
return 123;
}
//TODO: Export code here
我想以可以从 TypeScript 以这些方式导入的方式导出它:
import foo from 'foo';
import * as foo from 'foo';
并以这种方式从节点:
const foo = require ( 'foo' );
要求:
- 我不知道我模块的用户必须设置
allowSyntheticDefaultImports
选项
- 我希望导出模块的代码尽可能干净
- 我想保留类型定义
到目前为止,我已经提出了以下 "solutions",但它们要么没有很好地保留类型定义,要么过于冗长:
export = foo['default'] = foo as typeof foo & { default: typeof foo };
export = foo['default'] = foo;
有没有更好的方法?
据我所知,NodeJS 尚不支持导出和导入。
查看这篇文章:
据我所知,使用 TypeScript 类型语法的唯一方法是仅在 .ts
文件中,因此一个选项是将您需要的 .ts
文件编译为 .js
使用通天塔
由于您是作为 commonjs 包发布的,因此不需要 rollup/webpack。
您只需使用 TypeScript 编译器将您的代码转译为 commonjs 中的 es5。
您的 tsconfig.json 应如下所示:
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"moduleResolution": "node",
"target": "es5",
"outDir": "dist" // customize this yourself.
...
}
}
在你的 package.json 中:
// package.json
{
"main": "dist/index.js",
"typings": "dist/inde.d.ts",
"files": [
"dist" // customize this yourself.
],
...
}
这是您可以查看的示例存储库:
这是我能想到的最好的:
export = Object.assign ( foo, { default: foo } );
非常简洁,正确生成了类型定义,并且可以使用上述所有方法导入。
假设有以下 TypeScript 模块:
function foo () {
return 123;
}
//TODO: Export code here
我想以可以从 TypeScript 以这些方式导入的方式导出它:
import foo from 'foo';
import * as foo from 'foo';
并以这种方式从节点:
const foo = require ( 'foo' );
要求:
- 我不知道我模块的用户必须设置
allowSyntheticDefaultImports
选项 - 我希望导出模块的代码尽可能干净
- 我想保留类型定义
到目前为止,我已经提出了以下 "solutions",但它们要么没有很好地保留类型定义,要么过于冗长:
export = foo['default'] = foo as typeof foo & { default: typeof foo };
export = foo['default'] = foo;
有没有更好的方法?
据我所知,NodeJS 尚不支持导出和导入。
查看这篇文章:
据我所知,使用 TypeScript 类型语法的唯一方法是仅在 .ts
文件中,因此一个选项是将您需要的 .ts
文件编译为 .js
使用通天塔
由于您是作为 commonjs 包发布的,因此不需要 rollup/webpack。
您只需使用 TypeScript 编译器将您的代码转译为 commonjs 中的 es5。
您的 tsconfig.json 应如下所示:
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"moduleResolution": "node",
"target": "es5",
"outDir": "dist" // customize this yourself.
...
}
}
在你的 package.json 中:
// package.json
{
"main": "dist/index.js",
"typings": "dist/inde.d.ts",
"files": [
"dist" // customize this yourself.
],
...
}
这是您可以查看的示例存储库:
这是我能想到的最好的:
export = Object.assign ( foo, { default: foo } );
非常简洁,正确生成了类型定义,并且可以使用上述所有方法导入。