当前位置: 首页 > 科技观察

面试官:谈谈你对TypeScript中命名空间和模块的理解?区别?

时间:2023-03-21 21:19:28 科技观察

1.模块TypeScript与ECMAScript2015相同。任何包含顶级导入或导出的文件都被视为一个模块。相反,如果文件没有顶级导入或导出声明,则其内容被认为是全局可见的。比如我们在一个TypeScript项目下新建一个文件1.ts,声明一个变量a,如下:consta=1然后在另一个文件中声明一个变量a,这时候会出现提示重复声明变量的错误信息a,但空间是全局的。如果需要解决这个问题,可以通过import或者export引入模块系统,如下:consta=10;exportdefaulta在typescript中,export关键字可以导出变量或者类型,用法和es6模块一致。如下:exportconsta=1exporttypePerson={name:String}通过import引入模块,如下:import{a,Person}from'./export';2.命名空间命名空间最明确的目的之一就是解决重名问题命名空间定义限制一个标识符的可见范围,一个标识符可以定义在多个命名空间中,其在不同命名空间中的含义是相互独立的。这样,任何标识符都可以定义在一个新的命名空间中,并且它们不会与任何现有的标识符冲突,因为现有的定义在其他命名空间中。TypeScript中的命名空间是使用命名空间定义的。语法如下:namespaceSomeNameSpaceName{exportinterfaceISomeInterfaceName{}exportclassSomeClassName{}}上面定义了一个命名空间SomeNameSpaceName,如果我们需要对外调用SomeNameSpaceName中的类和接口,需要在类和接口中加上export关键字,如下:SomeNameSpaceName.SomeClassName命名空间本质上是一个对象,其作用是将一系列相关的全局变量组织到一个对象的属性中,如下:namespaceLetter{exportleta=1;exportletb=2;exportletc=3;//...exportletz=26;}编译成js如下:varLetter;(function(Letter){Letter.a=1;Letter.b=2;Letter.c=3;//...Letter.z=26;})(字母||(字母={}));3.DistinguishedNamespace是一个普通的JavaScript对象,名字位于全局命名空间下,非常好用但是和其他全局命名空间污染一样,很难识别组件之间的依赖关系,尤其是在较大的应用程序中,像命名空间一样,模块可以包含代码和声明。不同之处在于模块可以声明其依赖项。在正常的TS项目开发过程中不建议使用命名空间,但通常在通过d.ts文件标记js库类型时使用命名空间。主要功能是为编译器编写代码时参考参考资料https://www.tslang.cn/docs/handbook/modules.htmlhttps://www.tslang.cn/docs/handbook/namespaces.htmlhttps:///www.tslang.cn/docs/handbook/namespaces-and-modules.html