Typescript学习笔记(16) ----- namespace 命名空间

命名空间可以解决模块化问题, 防止暴露统一的接口

比如,Header,Body,Footer是三个模块

// index.ts 文件
class Header{
  constructor(){
    let element = document.createElement('div')
    element.innerText='Header'
    document.body.appendChild(element)
  }
}

class Body{
  constructor(){
    let element = document.createElement('div')
    element.innerText='Body'
    document.body.appendChild(element)
  }
}

class Footer{
  constructor(){
    let element = document.createElement('div')
    element.innerText='Footer'
    document.body.appendChild(element)
  }
}

class Page{
  constructor(){
    new Header()
    new Body()
    new Footer()
  }
}

//html 文件
<script>
  new Page()
</script>

这样编写完成之后,虽然完成了简单的拆分,但没有完全做到模块化。
从编译完的代码中,可以发现,Header,Body,Footer都升为了全局变量。

image.png

从console里面可以访问到这个变量
image.png

为了能够防止变量的暴露,这里需要用到命名空间去进行限制。

namespace Home{
  class Header{
    constructor(){
      let element = document.createElement('div')
      element.innerText='Header'
      document.body.appendChild(element)
    }
  }
  
  class Body{
    constructor(){
      let element = document.createElement('div')
      element.innerText='Body'
      document.body.appendChild(element)
    }
  }
  
  class Footer{
    constructor(){
      let element = document.createElement('div')
      element.innerText='Footer'
      document.body.appendChild(element)
    }
  }
  
  export class Page{
    constructor(){
      new Header()
      new Body()
      new Footer()
    }
  }
}
//index.html
<script>
  new Home.Page()
</script>

使用命名空间包裹了一层之后,就不会对外暴露了

如果需要挂载在命名空间上需要使用export

可以接着上面的继续进行拆分,将组件相关的拆到component.ts之中。
然后更改一下对compoent下的文件的引用。

new Components.Header()
new Components.Body()
new Components.Footer()

由于分别在两个文件之中引入了命名空间,所以在html中需要引入两个相关的文件,亦或者将多个文件编译到同一份文件中去。

  • 更改tsconfig.json中的outFile 属性,制定打包后的文件名
  • 更改之后,会报错,需要将module更改为amd
    "module": "amd",
    "outFile": "./build/page.js", 
  • namespace之间的依赖关系
    通过/// <reference path=''>这样的形式表示
/// <reference path='./component.ts'/>
namespace Home{
  export class Page{
    constructor(){
      new Components.Header()
      new Components.Body()
      new Components.Footer()
    }
  }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。