2016-02-14 12 views
5

Poniższy tekst przedstawia prawidłowy, działający ES5, ale podaje poniżej błąd. Używam maszynopisu 1.7.5 i myślę, że przeczytałem specyfikację całego języka i nie mogę zrozumieć, dlaczego ten błąd został wygenerowany.Jak zaimportować moduł CommonJS, który używa modułu.exports = w Opisie maszynowym

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

a.js (moduł otoczenia ES5 z domyślną eksportu)

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 (wygenerowane ES5):

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

Co to jest linia błędu? –

+0

Linia 2 testu.ts. at test() – drewlio

+0

BTW, dość mylące, że twój post używa nazwy bazowej "test" dla wszystkich trzech twoich plików. Trzeci plik, który importuje "./test" i nazywa się "test.ts", z pewnością jest czymś innym. :) –

Odpowiedz

5

module.exports eksportuje wartość literalną w module CommonJS, ale export default mówi eksportowania właściwość default, która nie jest to, co Kod JavaScript faktycznie to robi.

Poprawna składnia eksport w tym przypadku jest po prostu export = myfunc:

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

To działa. Dziękuję Ci. Myślę, że specyfikacja Typescript naprawdę sprowadziła mnie tutaj na manowce. Odnośnie przydziałów eksportu mówi: "Przydziały eksportu istnieją dla wstecznej kompatybilności z wcześniejszymi wersjami TypeScript." ([odniesienie] (https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#1135-export-assignments)), co oznacza, że ​​jest to stary sposób i nie powinieneś używać przypisań eksportu w nowym kodzie . [Ta odpowiedź] (http://stackoverflow.com/questions/34622598/typescript-importing-from-libraries-written-in-es5-vs-es6) jest blisko spokrewniona. – drewlio

+0

Również dla przyszłego czytnika 'module.exports =' w ES5 ** nie ** jest "eksportem domyślnym", który jest terminem ES6. Specyfikacja specyfikacji specyfikuje 'default' entity [here] (https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#11342-export-default-declarations). – drewlio