【问题标题】:Typescript creating modules打字稿创建模块
【发布时间】:2016-06-22 16:26:11
【问题描述】:

我想为我们的库创建模块,所以每次调用时,我们都可以使用import {Api, Map} from "ourlibrary"

目前我正在使用以下。

import {Api} from "../../Library/Api";
import {MapPage} from "../map/map";

我如何创建自己的包以获得以下结果?

import {Api, Map} from "OurLib"

【问题讨论】:

    标签: typescript angular


    【解决方案1】:

    我看到了两个步骤:

    • 在您的 SystemJS 配置的 map 块中创建一个条目:

      System.config({
        map: {
          'OurLib': 'path-to-ourlib'
        },
        packages: {
          'OurLib': {
            main: 'index.js',
            defaultExtension: 'js'
          }
        }
      });
      
    • 创建一个 TypeScript 文件(例如,index.ts)作为入口点模块,用于导入/导出您想要在库之外提供的内容:

      export {Api} from "../../Library/Api";
      export {MapPage} from "../map/map";
      

    【讨论】:

    • 我正在使用具有 tscnofig.json 的 ionic ...如何使用 tsconfig 上的设置? pastie.org/10752352 - 它也有 webdev.. 有点不确定这是在 webdev 还是 tsconfig
    • 你的意思是你想为你的库定义一个契约,即一个ourlib.d.ts?
    【解决方案2】:

    创建一个顶级 ES6 样式 js 文件,将您的导入导出为单个文件并将其命名为 OurLib

    exports.Api = require('../../Library/Api').Api;
    exports.Map = require('.../map/map').Map;
    

    这种方法的好处是它不会将您绑定到单个模块加载器系统。由于它是直接的 ES6 特性(需要/导出),它可以被 SystemJS、Webpack、Typescript 等使用。

    正如下面评论中提到的,.Api.Map 在 require 语句末尾的原因是因为您通常从文件中导入的是类。在

    的情况下,您将使用这样的语法
    export class Api {}
    

    export class Map {}
    

    在每个相应的文件中。这样,您只分配您想要导出的类,而不是整个所需的文件。它使您可以更好地控制捆绑的、公开的模块。

    【讨论】:

    • 为什么在行尾使用.Api & .map
    • 您通常会引用该导入文件中的特定类。
    • 你的意思是.Api and .map 是导出类的名称?
    • @Basit 全局“命名空间”将由文件名“OurFile”定义。但是,您可以导出所有内容,这将阻止您进行任何您想要做的重命名/重新映射,并且它实际上会导出您可能不想做的所有内容。
    • @Basit 您的 index.d.ts 文件是什么样的?里面真的有什么东西被导出了吗?
    猜你喜欢
    • 2018-03-21
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多