美文网首页
命名空间 namespace

命名空间 namespace

作者: 泡杯感冒灵 | 来源:发表于2022-04-15 12:26 被阅读0次
namespace 在typescript里给我们带来的好处就是给我们一个类似模块化开发的方式,让我们能尽量少的声明全局变量。或者说,把一组相关的内容,封装到一起去。对外提供统一的暴露接口
不用命名空间的情况下
// page.ts
class Header {
    constructor() {
      const elem = document.createElement('div');
      elem.innerText = 'this is Header';
      document.body.appendChild(elem);
    }
  }
  
  class Content {
    constructor() {
      const elem = document.createElement('div');
      elem.innerText = 'this is Content';
      document.body.appendChild(elem);
    }
  }
  
  class Footer {
    constructor() {
      const elem = document.createElement('div');
      elem.innerText = 'this is Footer';
      document.body.appendChild(elem);
    }
  }
  
  export class Page {
    constructor() {
      new Header();
      new Content();
      new Footer();
    }
  }

// 编译后的 page.js
"use strict";
var Header = /** @class */ (function () {
    function Header() {
        var elem = document.createElement('div');
        elem.innerText = 'this is Header';
        document.body.appendChild(elem);
    }
    return Header;
}());
var Content = /** @class */ (function () {
    function Content() {
        var elem = document.createElement('div');
        elem.innerText = 'this is Content';
        document.body.appendChild(elem);
    }
    return Content;
}());
var Footer = /** @class */ (function () {
    function Footer() {
        var elem = document.createElement('div');
        elem.innerText = 'this is Footer';
        document.body.appendChild(elem);
    }
    return Footer;
}());
var Page = /** @class */ (function () {
    function Page() {
        new Header();
        new Content();
        new Footer();
    }
    return Page;
}());

// index.html引用 page.js
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script src="./dist/page.js"></script>
</head>
<body>
  <script>
    new Page();
  </script>
</body>
</html>

上边这种写法,会出现一种情况,那就是暴露出了过多的全局变量。
image.png
为了避免这种情况出现,可以使用命名空间的写法,用namespace Home{ }包裹。然后就可以通过Home.来访问里边的变量,当然,只能访问里边通过export导出的变量
namespace Home{
  class Header {
    constructor() {
      const elem = document.createElement('div');
      elem.innerText = 'this is Header';
      document.body.appendChild(elem);
    }
  }
  
  class Content {
    constructor() {
      const elem = document.createElement('div');
      elem.innerText = 'this is Content';
      document.body.appendChild(elem);
    }
  }
  
  class Footer {
    constructor() {
      const elem = document.createElement('div');
      elem.innerText = 'this is Footer';
      document.body.appendChild(elem);
    }
  }
  
  export class Page {
    constructor() {
      new Header();
      new Content();
      new Footer();
    }
  } 
}

// 编译后的 page.js
"use strict";
var Home;
(function (Home) {
    var Header = /** @class */ (function () {
        function Header() {
            var elem = document.createElement('div');
            elem.innerText = 'this is Header';
            document.body.appendChild(elem);
        }
        return Header;
    }());
    var Content = /** @class */ (function () {
        function Content() {
            var elem = document.createElement('div');
            elem.innerText = 'this is Content';
            document.body.appendChild(elem);
        }
        return Content;
    }());
    var Footer = /** @class */ (function () {
        function Footer() {
            var elem = document.createElement('div');
            elem.innerText = 'this is Footer';
            document.body.appendChild(elem);
        }
        return Footer;
    }());
    var Page = /** @class */ (function () {
        function Page() {
            new Header();
            new Content();
            new Footer();
        }
        return Page;
    }());
    Home.Page = Page;
})(Home || (Home = {}));

// index.html引用 page.js
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script src="./dist/page.js"></script>
</head>
<body>
  <script>
    new Home.Page();
  </script>
</body>
</html>
命名空间声明后,会形成全局变量。命名空间之间也会相互依赖。具体依赖的写法就是通过 ///<reference path='./components.ts'/>
// components.ts
namespace Components{
  export class Header {
    constructor() {
      const elem = document.createElement('div');
      elem.innerText = 'this is Header';
      document.body.appendChild(elem);
    }
  }
  
  export class Content {
    constructor() {
      const elem = document.createElement('div');
      elem.innerText = 'this is Content';
      document.body.appendChild(elem);
    }
  }
  
  export class Footer {
    constructor() {
      const elem = document.createElement('div');
      elem.innerText = 'this is Footer';
      document.body.appendChild(elem);
    }
  }
}

// page.ts
/// <reference path='./components.ts'/>

namespace Home{
  export class Page {
    constructor() {
      new Components.Header();
      new Components.Content();
      new Components.Footer();
    }
  } 
}
命名空间,还可以暴露interface
namespace Components{
  export interface User{
    name: string;
  }
  
  export class Header {
    constructor() {
      const elem = document.createElement('div');
      elem.innerText = 'this is Header';
      document.body.appendChild(elem);
    }
  }
  
  export class Content {
    constructor() {
      const elem = document.createElement('div');
      elem.innerText = 'this is Content';
      document.body.appendChild(elem);
    }
  }
  
  export class Footer {
    constructor() {
      const elem = document.createElement('div');
      elem.innerText = 'this is Footer';
      document.body.appendChild(elem);
    }
  }
}


// page.ts
/// <reference path='./components.ts'/>

namespace Home{
  export class Page {
    user: Components.User = {
      name:'yang'
    }
    constructor() {
      new Components.Header();
      new Components.Content();
      new Components.Footer();
    }
  } 
}

命名空间里,还可以导出子的命名空间
namespace Components{
  export namespace SubComponents{
    export class Test{}
  }

  export interface User{
    name: string;
  }

  export class Header {
    constructor() {
      const elem = document.createElement('div');
      elem.innerText = 'this is Header';
      document.body.appendChild(elem);
    }
  }
  
  export class Content {
    constructor() {
      const elem = document.createElement('div');
      elem.innerText = 'this is Content';
      document.body.appendChild(elem);
    }
  }
  
  export class Footer {
    constructor() {
      const elem = document.createElement('div');
      elem.innerText = 'this is Footer';
      document.body.appendChild(elem);
    }
  }
}
image.png

相关文章

  • 命名空间 namespace

    /*命名空间:命名空间是一种封装事物的方法命名空间怎么声明?关键字: namespace 导入命名空间: use起...

  • 命名空间(namespace)

    命名空间,也称名称空间,名字空间。命名空间是用来组织和重构代码的。如同名字一样的意思,NameSpace(名字空间...

  • 命名空间 namespace

    命名空间 附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义...

  • 命名空间namespace

    outer_func的local中的outer_arg的值为1.inner_func的local中的outer_a...

  • 命名空间(namespace)

    通常来说,命名空间是唯一识别的一套名字,这样当对象来自不同的地方但是名字相同的时候就不会含糊不清了。 为什么需要命...

  • namespace 命名空间

    避免命名冲突, 相当于引入类使用时需要nmsl.anmsl.b

  • 命名空间 namespace

    namespace 在typescript里给我们带来的好处就是给我们一个类似模块化开发的方式,让我们能尽量少的声...

  • C#随笔1

    1命名空间 语法 namespace 命名空间名称{若干个类型} ORnamespace 命名空间名称.子命名...

  • 四十、Docker网络-网络命名空间

    网络命名空间 Linux的Namespace(命名空间)技术是一种隔离技术,常用的Namespace有 user ...

  • C++入门05 --命名空间,继承,访问权限,初始化列表

    命名空间 命名空间主要是用来解决命名冲突的; namespace xxxx { }:命名空间的定义; 利用::域运...

网友评论

      本文标题:命名空间 namespace

      本文链接:https://www.haomeiwen.com/subject/lbggsrtx.html