如何导入在Typescript中使用module.exports =的CommonJS模块

dre*_*lio 10 typescript ecmascript-6 typescript1.7

以下产生有效的工作ES5但发出以下错误.我正在使用Typescript 1.7.5,我想我已经阅读了整个语言规范,我无法弄清楚为什么会产生这个错误.

error TS2349: Cannot invoke an expression whose type lacks a call signature.
Run Code Online (Sandbox Code Playgroud)

a.js(默认导出的ES5环境模块)

function myfunc() {
  return "hello";
}
module.exports = myfunc;
Run Code Online (Sandbox Code Playgroud)

ADTS

declare module "test" {
    export default function (): string;
}
Run Code Online (Sandbox Code Playgroud)

b.ts

import test = require("test");
const app = test();
Run Code Online (Sandbox Code Playgroud)

b.js(生成的ES5):

var test = require("test");
var app = test()
Run Code Online (Sandbox Code Playgroud)

C S*_*ver 7

module.exports在CommonJS模块export default中导出文字值,但表示您正在导出default属性,这不是您的JavaScript代码实际执行的操作.

在这种情况下,正确的导出语法很简单export = myfunc:

declare module "test" {
    function myfunc(): string;
    export = myfunc;
}
Run Code Online (Sandbox Code Playgroud)

  • 另外,对于未来的读者来说,ES5 中的“module.exports=”**不是**“默认导出”,这是 ES6 术语。Typescript 规范[此处]解释了“default”实体(https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#11342-export-default-declarations)。 (2认同)