2016-02-14 45 views
5

有効な有効なES5が生成されますが、以下のエラーが発生します。私はTypescript 1.7.5を使用しています。私は言語仕様全体を読んだと思います。なぜこのエラーが発生するのか分かりません。Module.exports =をTypescriptで使用するCommonJSモジュールをインポートする方法

error TS2349: Cannot invoke an expression whose type lacks a call signature. 

a.js(デフォルトのエクスポートとES5周囲モジュール)

function myfunc() { 
    return "hello"; 
} 
module.exports = myfunc; 

a.d.ts

declare module "test" { 
    export default function(): string; 
} 

b.ts

import test = require("test"); 
const app = test(); 

b.js(生成ES5):

var test = require("test"); 
var app = test() 
+0

このエラーが上で何行ですか? –

+0

test.tsの2行目。 test() – drewlio

+0

ご参考までに、あなたの投稿が3つのファイルすべてに対してベース名 "test"を使用するのはかなり混乱します。 "./test"をインポートし、 "test.ts"と呼ばれる3番目のファイルは、実際は別のものです。 :) –

答えて

5

module.exportsはCommonJSモジュール内のリテラル値をエクスポートしますが、export defaultは、あなたが何をお使いではありませんdefaultプロパティを、エクスポートされていると言います実際にはJavaScriptコードがあります。

この場合、正しい輸出構文は単にexport = myfuncです:

declare module "test" { 
    function myfunc(): string; 
    export = myfunc; 
} 
+0

これは機能します。ありがとうございました。私はTypescriptの仕様が本当に私をここに迷わせたと思う。エクスポートの割り当てに関しては、「以前のバージョンのTypeScriptとの下位互換性のためにエクスポートの割り当てが存在します。 ([reference](https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#1135-export-assignments))、これは古い方法であることを意味し、新しいコードでエクスポートの割り当てを使用しないでください。 [この回答](http://stackoverflow.com/questions/34622598/typescript-importing-from-libraries-written-in-es5-vs-es6)は密接に関連しています。 – drewlio

+0

また、将来の読者のために、ES5の 'module.exports ='は**ではなく、 "デフォルトの書き出し"であり、これはES6用語です。 Typescript仕様では、[default]エンティティ[ここ](https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#11342-export-default-declarations)について説明しています。 – drewlio

関連する問題