javascript - Importera AMD-moduler som inte använder exports med TypeScript
Inställningen
Jag försöker ladda befintliga AMD-moduler med TypeScript.
För att demonstrera mitt problem, här är en app.ts-fil som laddar en AMD-modul med namnet my_amd_module.js:
// app.ts
import * as amd_func from './my_amd_module';
function main(): void {
console.log(amd_func());
}
main();
Följande TypeScript-konfiguration används:
// tsconfig.json
{
"compileOnSave": true,
"compilerOptions": {
"allowJs": true,
"outDir": "build",
"sourceMap": true,
"target": "es5"
},
"exclude": [
"node_modules",
"build"
]
}
Och jag använder Webpack för att bunta filen app.ts i ett paket som heter app-bundle.js som kan köras av en webbläsare:
// webpack.config.js
'use strict';
const webpack = require('webpack');
const path = require('path');
module.exports = {
context: path.resolve(__dirname, 'src'),
entry: './app.ts',
output: {
path: path.resolve(__dirname, 'build'),
filename: 'app-bundle.js'
},
devtool: 'source-map',
resolve: {
extensions: ['', '.ts', '.js']
},
module: {
loaders: [
{test: /\.ts$/, loader: 'ts-loader'}
]
}
};
Den fungerande versionen
När my_amd_module.js ser ut som följande fungerar allt bra. Observera att jag refererar till 'module' som ett beroende och binder funktionen foo till dess exports-egenskap, vilket är en möjlig variant av att använda AMD.
// my_amd_module.js
define(['module'], function(module) {
function foo () {
return 'Hello from AMD!';
}
module.exports = foo;
});
Den icke fungerande versionen
Men när jag använder det alternativa syntaxet för att definiera en AMD-modul med ett returvärde istället för att tilldela till exports
// my_amd_module.js
define(function() {
function foo () {
return 'Hello from AMD!';
}
return foo;
});
då klagar TypeScript-kompilatorn med följande meddelande:
ERROR in ./app.ts
(1,27): error TS2306: File '/[...]/src/my_amd_module.js' is not a module.
Men filen app-bundle.js genereras fortfarande och allt fungerar i webbläsaren.
Den alternativa syntaxen jag använder i det här fallet beskrivs till exempel av RequireJS eller i AMD-specifikationen själv.
Min fråga
Är AMD-moduler som definierar sitt exporterade värde med ett return-värde istället för att tilldela till exports inte stödda av TypeScript? Är detta anledningen till att kompilatorn klagar? Och varför kompileras allt, trots denna klagomål?
Svar #1
Stöds inte AMD-moduler som definierar sitt exporterade värde med ett returvärde istället för att tilldela till exports av TypeScript
Ja. Tydligen detekteras det inte som en extern modul och antas vara global och får därför inte requireas. Vänligen skapa ett ärende här: https://github.com/Microsoft/TypeScript/issues