javascript - typescript 未生成正确的 system.register

标签 javascript dependency-injection typescript systemjs

所以,我的问题是:

我的应用程序文件结构如下:

Working Folder

当我 tsc 时,会生成相同的结构,但在 dist 目录下

编译配置设置如下:

{
    "compilerOptions": {
        "noImplicitAny": true,
        "target": "es5",
        "outDir":"dist",
        "module": "system", //commonjs, amd ( requirejs ) , system
        "moduleResolution": "node",
        "sourceMap": true,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "removeComments": false

    }
} 

我正在使用 Systemjs 在 index.html 上加载模块,如下所示:

  System.config({
         baseURL : "dist",  
      });

      System.import('Application.js')
            .then(null, console.error.bind(console));

Application.ts 文件是这样的:

import {SelectedProducts} from "./Controllers/SelectedProducts";

export class Application  {

    constructor(private controller:SelectedProducts){

    }
 // some methods here

 }

生成的Application.js文件是这样的:

System.register([], function(exports_1, context_1) {
    "use strict";
    var __moduleName = context_1 && context_1.id;
    var Application;
    return {
        setters:[],
        execute: function() {
            Application = (function () {
                function Application(controller) {
                    this.controller = controller;
                }
  // methods go here

       }());
            exports_1("Application", Application);
        }
    }
});

有人知道为什么会发生这种情况吗?

这并不是 system.register 不符合预期的唯一情况。

我的 ProductsController.ts 也生成错误:

ProductsController.ts 来源:

import {ProductsRepository} from "../Models/ProductsRepository";
import {EditProductView} from "../Views/EditProductView";
import {ListProductsView} from "../Views/ListProductsView";
import {Product} from "../Models/Product";
import {ProductsViewModel} from "../Views/ProductsViewModel";
import {ValidationProvider} from "../Validation/ValidationProvider";

export class SelectedProducts {

    public constructor(private productsRepository:ProductsRepository, 
    private editView:EditProductView,
    private listSelectedView:ListProductsView,
    private validation:ValidationProvider){

    } 
// some methods here

}

js生成的代码:

System.register(["../Models/Product", "../Views/ProductsViewModel"], function(exports_1, context_1) {
    "use strict";
    var __moduleName = context_1 && context_1.id;
    var Product_1, ProductsViewModel_1;
    var SelectedProducts;
    return {
        setters:[
            function (Product_1_1) {
                Product_1 = Product_1_1;
            },
            function (ProductsViewModel_1_1) {
                ProductsViewModel_1 = ProductsViewModel_1_1;
            }],
        execute: function() {
            SelectedProducts = (function () {
                function SelectedProducts(productsRepository, editView, listSelectedView, validation) {
                    this.productsRepository = productsRepository;
                    this.editView = editView;
                    this.listSelectedView = listSelectedView;
                    this.validation = validation;
                }

            }());
            exports_1("SelectedProducts", SelectedProducts);
        }
    }
});

有什么想法吗?

最佳答案

在 TypeScript 中,不用作值的模块导入将从输出中删除。这样做的理由是,您可以在设计时使用模块中的类型,但不打算将其用作运行时依赖项。在本例中,SelectedProducts 的唯一用途是作为构造函数参数的类型注释。

使用 import "./Controllers/SelectedProducts"; 确保保留模块导入。

请参阅https://github.com/Microsoft/TypeScript/wiki/FAQ#why-are-imports-being-elided-in-my-emit有关模块导入省略的更多信息。

关于javascript - typescript 未生成正确的 system.register,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37645591/

相关文章:

c++ - 源链接中具有相同类名的依赖注入(inject)到同一对象?

node.js - 在 foreach 语句中解决 promise

JavaScript 字符串解析为 false

javascript - 如何制作类似维基百科和 Facebook 的悬停效果

javascript - 在 Adob​​e InDesign CS5 中处理文本框中的文本

c# - 告诉 Resharper 使用 spring.net DI 配置来检查未使用的类?

javascript - 我的 JS 中有一个简单的逻辑错误,我缺乏知识来发现

angular - 创建 AoT 兼容的服务工厂

typescript - 类和计算属性

typescript - 如何处理 sweet.js 重命名 Typescript 输出中的顶级变量?