如何导出 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' );

要求:

到目前为止,我已经提出了以下 "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.
  ],
  ...
}

这是您可以查看的示例存储库:

https://github.com/unional/path-equal

这是我能想到的最好的:

export = Object.assign ( foo, { default: foo } );

非常简洁,正确生成了类型定义,并且可以使用上述所有方法导入。