我想将旧的AngularJS应用程序从JavaScript迁移到TypeScript。
为了加载需求,我使用了require.js。并且因为我想与non-require.js脚本兼容,所以我将umd用作module

例如,我有此文件。

customModule.ts

import angular = require('angular');

angular.module('customModule', []);


主要

import angular = require('angular');
import customModule = require('customModule');

angular
    .module('app')
    .factory('customFactory', ['customModule', class {
        constructor(
            private customModule
        ) { }

        out() {
            return this.customModule;
        };
    }]);


这将转换为该JavaScript。

customModule.js

(function (factory) {
    if (typeof module === "object" && typeof module.exports === "object") {
        var v = factory(require, exports);
        if (v !== undefined) module.exports = v;
    }
    else if (typeof define === "function" && define.amd) {
        define(["require", "exports", "angular"], factory);
    }
})(function (require, exports) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    var angular = require("angular");
    angular.module('customModule', []);
});


主要

(function (factory) {
    if (typeof module === "object" && typeof module.exports === "object") {
        var v = factory(require, exports);
        if (v !== undefined) module.exports = v;
    }
    else if (typeof define === "function" && define.amd) {
        define(["require", "exports", "angular"], factory);
    }
})(function (require, exports) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    var angular = require("angular");
    angular
        .module('app')
        .factory('customFactory', ['customModule', (function () {
            function class_1(customModule) {
                this.customModule = customModule;
            }
            class_1.prototype.out = function () {
                return this.customModule;
            };
            ;
            return class_1;
        }())]);
});


如您在main.js中看到的,有一个define(["require", "exports", "angular"], factory);。但是我希望define(["require", "exports", "angular", "customModule"], factory);

如果我将return this.customModule;上的main.ts替换为return customModule;,它将正确导出,但是我认为然后不需要构造函数。 -正如您在图片上看到的更改一样,我删除了构造函数,因为不需要它。

javascript - 通过将旧的AngularJS迁移到TypeScript,可以在require.js上忽略导入-LMLPHP

如果此问题得以解决,则可以将模块与TypeScript一起使用,就像将模块与JavaScript

最佳答案

TypeScript编译器经过优化,因此,如果您具有以下代码,则可能会发生魔术...

import * as angular from 'angular';
import * as customModule from 'customModule';

angular
    .module('app')
    .factory('customFactory', ['customModule', class {
        constructor(
            private customModule
        ) { }

        out() {
            return this.customModule;
        };
    }]);


因为编译器看不到customModule中对任何内容的任何引用,所以它优化了导入。

您可以使用导入的模块或通过强制导入来修复它,如下所示:

import * as angular from 'angular';
import 'customModule'; // <-- FORCED

angular
    .module('app')
    .factory('customFactory', ['customModule', class {
        constructor(
            private customModule
        ) { }

        out() {
            return this.customModule;
        };
    }]);

07-24 20:09