2016-11-16 63 views
2

我有这个module.ts文件:打字稿和AngularJS 1.5:如何办理出口类

import { IHttpService, IPromise } from 'angular'; 

export class ProductService { 
    static $inject = ["$http"]; 
    constructor(private $http: IHttpService) { } 

    loaded: boolean = false; 
    promise: IPromise<{ data: any }>; 

    getProducts(): IPromise<{ data: any }> { 
     if (!this.loaded) { 
      this.loaded = true; 
      this.promise = this.$http.get('/products.json'); 
     } 
     return this.promise; 
    } 
} 

var module = angular.module("psShopping", ["ngComponentRouter"]); 
module.value("$routerRootComponent", "shoppingApp"); 
module.service('products', ProductService); 

,这被transpiled /编译module.js:

"use strict"; 
var ProductService = (function() { 
    function ProductService($http) { 
     this.$http = $http; 
     this.loaded = false; 
    } 
    ProductService.prototype.getProducts = function() { 
     if (!this.loaded) { 
      this.loaded = true; 
      this.promise = this.$http.get('/products.json'); 
     } 
     return this.promise; 
    }; 
    ProductService.$inject = ["$http"]; 
    return ProductService; 
}()); 
exports.ProductService = ProductService; 
var module = angular.module("psShopping", ["ngComponentRouter"]); 
module.value("$routerRootComponent", "shoppingApp"); 
module.service('products', ProductService); 

有问题的行:exports.ProductService = ProductService;如果我手动删除这个应用程序 - 完美的作品。但是,如果我这样离开,在浏览器控制台中,我收到一个错误“出口未定义”。 可以做些什么呢?我不能从.ts文件中删除“导出”,因为这个类在其他文件中使用(我在那里导入它)。我尝试了不同的编译器选项,但它只是给了我不同的错误(如“定义没有定义”等),我不知道如何处理这个..也许theres一种方式,TSC将不会产生这条线?

谢谢你的帮助!

+1

你如何在浏览器中加载模块?你使用的是browserify/webpack/jspn等?你需要导出课程吗? – dtabuenc

+0

我只是有一个index.html附加所有的脚本文件。我附加的一个文件是上面的文件(module.js)。我只在应用程序中有一个模块(称为psShopping)。 – marc08

+0

在你的tsconfig中设置'“module”:“none”'选项 – dtabuenc

回答

3

每当您在打字稿中使用importexport关键字时,就会将该文件转换为模块。

模块设计以及模块系统,如commonjs工作,amdes6systemjs等....

如果要加载浏览器中的原始脚本,而无需使用一个模块lodaer或打捆如systemjs,webpack,browserify,jspm等....那么你不能使用外部模块(所以你不能使用导入/导出)。

您仍然可以使用绝对键入的类型,但您必须通过t ///<reference />标签加载它们。

如果使用打字稿2.0分型样的角度也可和默认导入当您运行

npm install @types/angular 

通常,这些分型将暴露的全局命名空间的声明,你现在就可以thorughout您的应用程序中使用。

例如,在你的情况的角度暴露了ng命名空间,你会使用它想:

promise: ng.IPromise<{ data: any }>; 

你也可以很容易地别名是:

import IPromise = ng.IPromise 

注意,这个进口行为与模块不同进口(它只是别名)。

如果你打算做除了一个简单的应用程序以外的任何事情,我强烈建议你使用一个模块加载程序,如webpack来编译和捆绑浏览器的应用程序。仅使用纯脚本有很多限制。