TL;DR
在TypeScript代码中使用named AMD modules时,请使用import ... from "...";
语法而不是import ... = require("...");
。
Explanation
我的主要应用程序(使用Logdown
模块)是用TypeScript编写的,并编译为ES5代码。我注意到,根据使用的TypeScript导入语法,输出会有所不同。
以下是差异:
import Logdown from "logdown";
export default class Main {
constructor(message: string) {
let logger: Logdown = new Logdown('Test');
logger.log();
}
}
编译成:
System.register(["logdown"], function(exports_1, context_1) {
"use strict";
var __moduleName = context_1 && context_1.id;
var logdown_1;
var Main;
return {
setters: [
function(logdown_1_1) {
logdown_1 = logdown_1_1;
}],
execute: function() {
Main = (function() {
function Main(message) {
var logger = new logdown_1.default('Test');
logger.log();
}
return Main;
}());
exports_1("default", Main);
}
}
});
并且:
import Logdown = require("logdown");
export default class Main {
constructor(message: string) {
let logger: Logdown = new Logdown('Test');
logger.log();
}
}
编译成:
System.register(["logdown"], function(exports_1, context_1) {
"use strict";
var __moduleName = context_1 && context_1.id;
var Logdown;
var Main;
return {
setters:[
function (Logdown_1) {
Logdown = Logdown_1;
}],
execute: function() {
Main = (function () {
function Main(message) {
var logger = new Logdown('Test');
logger.log();
}
return Main;
}());
exports_1("default", Main);
}
}
});
重要的部分是,当使用
import Logdown from "logdown";
时,编译后的 TypeScript 代码将创建新的实例,如下:
var logger = new logdown_1.default('Test');
。
但是,当使用
import Logdown = require("logdown");
时,编译后的 TypeScript 代码不会添加
default
属性,而是创建如下实例:
var logger = new Logdown('Test');
。
因此,对于我所拥有的模块类型(一个
named AMD module),我需要使用
import ... from "...";
语法。
logdown.js
中拥有命名模块将该文件转换为捆绑包而不是模块。如果没有看到导入该模块的完整源代码,无法回答你的问题。 - artemdefault
不是由模块加载器创建的,而是由导出声明创建的。 - Bergi