javascript - Nhập các module AMD không sử dụng exports với TypeScript
Bối cảnh
Tôi đang cố gắng tải các mô-đun AMD hiện có bằng TypeScript.
Để minh họa vấn đề của tôi, đây là một tệp app.ts tải một module AMD có tên my_amd_module.js:
// app.ts
import * as amd_func from './my_amd_module';
function main(): void {
console.log(amd_func());
}
main();
Cấu hình TypeScript sau đây được sử dụng:
// tsconfig.json
{
"compileOnSave": true,
"compilerOptions": {
"allowJs": true,
"outDir": "build",
"sourceMap": true,
"target": "es5"
},
"exclude": [
"node_modules",
"build"
]
}
Và tôi đang sử dụng Webpack để đóng gói tệp app.ts vào một gói có tên app-bundle.js mà trình duyệt có thể chạy:
// 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'}
]
}
};
Phiên bản đang hoạt động
Khi my_amd_module.js trông như sau, mọi thứ hoạt động tốt. Lưu ý rằng tôi đang tham chiếu 'module' như một phụ thuộc và gán hàm foo vào thuộc tính exports của nó, đây là một trong những cách sử dụng AMD.
// my_amd_module.js
define(['module'], function(module) {
function foo () {
return 'Hello from AMD!';
}
module.exports = foo;
});
Phiên bản không hoạt động
Nhưng khi tôi sử dụng cú pháp thay thế để định nghĩa một module AMD với giá trị trả về thay vì gán cho exports
// my_amd_module.js
define(function() {
function foo () {
return 'Hello from AMD!';
}
return foo;
});
sau đó trình biên dịch TypeScript sẽ báo lỗi với thông điệp sau:
ERROR in ./app.ts
(1,27): error TS2306: File '/[...]/src/my_amd_module.js' is not a module.
Nhưng tệp app-bundle.js vẫn được tạo ra và mọi thứ hoạt động trong trình duyệt.
Cú pháp thay thế mà tôi đang sử dụng trong trường hợp này, ví dụ, được mô tả bởi RequireJS hoặc trong chính đặc tả AMD.
Câu hỏi của tôi
Các module AMD định nghĩa giá trị xuất khẩu của chúng bằng giá trị return thay vì gán cho exports có bị TypeScript không hỗ trợ không? Có phải đây là lý do khiến trình biên dịch báo lỗi không? Và tại sao mọi thứ vẫn được biên dịch, mặc dù có cảnh báo này?
Câu trả lời #1
Các module AMD định nghĩa giá trị xuất khẩu của chúng bằng giá trị trả về thay vì gán cho exports có được TypeScript hỗ trợ không
Vâng. Rõ ràng nó không được phát hiện như một module bên ngoài và được suy luận là global và do đó không được phép require. Vui lòng tạo một vấn đề tại đây: https://github.com/Microsoft/TypeScript/issues