0

我想将我的旧 AngularJS 应用程序从 JavaScript 迁移到 TypeScript。为了加载我使用 require.js 的要求。umd而且因为我想与我使用的非require.js 脚本兼容module

例如我有这个文件。

customModule.ts

import angular = require('angular');

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

main.ts

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', []);
});

main.ts

(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.tsreturn customModule;正确导出它,但我认为我不需要构造函数。- 正如您在图片上看到的更改,我删除了构造函数,因为它不需要。

删除构造函数后 main.js 的变化

如果这个问题得到解决,我可以将我的模块与 TypeScript 一起使用,就像我将它们与 JavaScript <3 一起使用一样

4

1 回答 1

1

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;
        };
    }]);
于 2017-09-28T18:05:03.983 回答