无法从nodejs中的打字稿文件中要求默认导出的函数

not able to require default exported function from typescript file in nodejs

我正在尝试用打字稿构建一个 npm 包。 我无法要求和使用 typescript 模块中导出的默认函数。我曾尝试将 tsconfig.json 中的模块选项更改为 UMDAMD,但没有成功。

//index.ts
export default function () {
  console.log("greet");
}

export function greet2() {
  console.log("greet2");
}
//tsconfig.json
{

  "compilerOptions": {
    "target": "es5",
    "module": "commonJS",
    "declaration": true,
    "outDir": "./lib",
    "strict": true
  }
}
//index.js
const greet = require("./lib/index");

greet();

greet.greet2();
//console
greet();
^

TypeError: greet is not a function

可以使用webpack来解决,但是我想知道有没有不用webpack的方法。

问题是您混合了模块语法。当您使用 require 时,您将取回一个带有 default 属性 和 greet2 属性.

的对象

require 假设您知道导出的结构,因为它们几乎可以是您用 module.exports = anything 指定的任何形状,另一方面,ES 模块有严格的规范。这允许 import 假设来自 export 的形状并做一些事情,比如方便地为你解构它。

目前,如果你记录它,greet 变量将是一个像这样的对象:

Object {default: function _default(), greet2: function greet2()}

这当然不是函数,因此是错误。

如果改为使用导入语法

import greet from './lib/index';

它将编译成等同于:

const greet = require('./lib/index').default;

您当然可以以同样的方式使用 require 自己,您只需要知道从 require 返回的任何内容的形状并相应地对其进行解构。