TypeScript中的模块与命名空间

2023-11-05

一、模块

TypeScript中,模块是一种组织和封装代码的方式。模块使得代码可以按照特定的规则划分为不同的文件,并且可以在这些文件之间进行导入和导出,从而实现代码的重用和组织。

1. 默认导入导出

默认模块导出是一种特殊的导出语法,在一个模块中只能有一个默认导出。默认导出可以是任何合法的JavaScript表达式,可以是一个对象、一个函数、一个类等等。

使用默认模块导出步骤如下:

  1. 在模块中定义默认导出的内容,例如一个对象:

    // module.ts
    export default {
      name: "John",
      age: 25
    };
    
  2. 导入模块的地方使用导入语法导入默认模块,并为其指定一个名字(这个名字可以自定义):

    // main.ts
    import person from "./module";
    console.log(person.name); // "John"
    console.log(person.age); // 25
    

注意事项

  1. 默认导出不需要使用花括号{}来包裹,而且导入时名字可以自定义但是还是建议在导入时使用与默认导出名字相同的变量名,因为不同的变量名会增加代码的阅读难度
  2. 可以与命名导出同时存在,但在一个模块中只能有一个默认导出
  3. 默认导出的内容是一个整体,不能像命名导出一样只导入其中的某个成员。例如,如果默认导出的是一个对象,那么导入的时候只能使用整个对象,而不能只使用其中的某个属性或方法

除了默认导出,TypeScript还支持命名导出,可以在一个模块中导出多个命名实体,并在导入时分别使用花括号{}来指定导入的内容。命名导出和默认导出的组合使用可以让我们更灵活地在模块中共享代码。

2. 命名导入导出

使用命名导入导出模块步骤如下:

  1. 定义模块:在一个文件中使用关键字export将需要导出的变量、函数或类标记为可导出的。
    例如,我们有一个helper.ts文件,其中定义了两个函数:
export function greet(name: string) {
  console.log(`Hello, ${name}!`);
}

export function calculateSum(a: number, b: number) {
  return a + b;
}
  1. 导入模块:在另一个文件中使用关键字import导入需要使用的模块。
    例如,我们有一个main.ts文件,需要使用helper.ts中的函数:
import { greet, calculateSum } from './helper';

greet('John');
console.log(calculateSum(5, 3));
  1. 编译和执行:使用TypeScript编译器(如tsc命令)将TypeScript代码转换为JavaScript代码,然后执行JavaScript代码。

使用模块时需要注意以下几点:

  1. 导入和导出的名称必须匹配:在导入模块时,需要使用导出模块的名称来引用它们。如果导出的是一个默认导出(使用关键字export default),则可以自定义导入的名称

  2. 导入模块的路径需要正确:在导入模块时,需要提供正确的文件路径。可以使用相对路径或绝对路径来指定模块的位置。

  3. 避免循环依赖:当模块之间存在循环依赖时,可能会导致编译和执行出错。应该尽量避免循环依赖的情况。

3. 默认和命名混合使用

在一个模块文件中,可以同时导出默认模块和命名模块,但是导入时需要使用不同的语法。例如:

  • 导出时
// 模块:mathUtils.ts
export default function add(a: number, b: number): number {
  return a + b;
}

export function subtract(a: number, b: number): number {
  return a - b;
}
  • 导入时

分开导入

// 导入默认导出
import add from 'mathUtils';

// 导入命名导出
import { subtract } from 'mathUtils';

同时导入

// 导入默认导出和命名导出
import add, { subtract } from 'mathUtils';

二、命名空间

1. 什么是命名空间

TypeScript中,命名空间(namespace)是用来组织和管理代码的一种方式。它提供了一种将相关的代码分组、隔离和导出的机制,避免了全局命名冲突的问题。

命名空间的使用通过namespace关键字来定义,可以在一个文件中定义多个命名空间,并且可以嵌套使用。命名空间中可以包含类、函数、接口和其他命名空间。

下面是一个示例,演示了如何在TypeScript中使用命名空间:

namespace Shapes {
  export interface Shape {
    name: string;
    calculateArea(): number;
  }

  export class Circle implements Shape {
    constructor(public name: string, public radius: number) {}

    calculateArea() {
      return Math.PI * Math.pow(this.radius, 2);
    }
  }

  export class Rectangle implements Shape {
    constructor(public name: string, public width: number, public height: number) {}

    calculateArea() {
      return this.width * this.height;
    }
  }
}

const circle = new Shapes.Circle("Circle", 5);
console.log(circle.calculateArea()); // 输出: 78.53981633974483

const rectangle = new Shapes.Rectangle("Rectangle", 3, 4);
console.log(rectangle.calculateArea()); // 输出: 12

在上面的代码中,命名空间Shapes被用来组织包含了Shape接口、Circle类和Rectangle类的代码。通过使用export关键字,这些内容可以在命名空间外部访问到。

命名空间中的元素可以通过namespace.element的方式进行访问。在上面的示例中,通过Shapes.CircleShapes.Rectangle来实例化了CircleRectangle类。

2. 命名空间的使用场景

在TypeScript中,当需要将相似的类、接口、函数或常量归类并按照一定的层次结构组织时,可以使用命名空间。命名空间提供了一种将相关的代码进行分组的机制,能够避免全局命名冲突,并且可以帮助组织和管理代码。

以下是一些使用命名空间的情况和示例说明:

  1. 防止命名冲突:当在一个项目中使用第三方库或引入其他模块时,可能会存在命名冲突的问题。可以使用命名空间来避免这些冲突。例如:
// myLib.ts
namespace MyLib {
  export class MyClass {
    // ...
  }
}

// app.ts
let obj = new MyLib.MyClass();
  1. 模块/组件的命名空间:当需要组织项目中的模块或组件时,可以使用命名空间。例如,可以将所有涉及用户界面的类和函数放在一个命名空间中:
// ui.ts
namespace MyApp.UI {
  export class Button {
    // ...
  }

  export function showAlert(message: string) {
    // ...
  }
}

// app.ts
let btn = new MyApp.UI.Button();
MyApp.UI.showAlert("Hello!");
  1. 兼容其他库或框架:某些第三方库或框架可能已经使用了全局命名空间,并且要在TypeScript项目中使用这些库时,可以使用命名空间来与这些库进行兼容。例如:
// myLib.d.ts (声明文件)
declare namespace ThirdPartyLib {
  // 声明第三方库中的类、方法等
}

// app.ts
let obj = new ThirdPartyLib.SomeClass(); // 使用第三方库的类

需要注意的是,TypeScript已经引入了模块化的概念,模块和命名空间是互斥的,不能同时使用,使用ES6模块的导入和导出语法已经足够满足大部分需求命名空间主要用于兼容旧的JavaScript代码或处理特定的命名冲突问题。因此,如果在新项目中开始使用TypeScript,推荐使用模块化来管理代码,而不是过度依赖命名空间。

为什么?
因为

  1. 使用模块替代命名空间:由于模块提供了更好的模块化支持,推荐使用模块来组织代码。如果项目已经使用了命名空间来组织代码,可以逐步将代码重构为模块。

  2. 使用模块化语法:模块使用的是模块化语法,例如使用 import 和 export 来导入和导出模块中的内容,而命名空间使用的是传统的命名空间语法,例如使用 namespace 和 module 来定义命名空间。

  3. 模块化的文件结构:模块的文件结构应该符合模块化的规范,例如一个模块应该是一个独立的文件,文件名应该与模块名相同。

  4. 使用模块解决命名冲突:如果有多个模块之间存在命名冲突,可以使用模块的导入导出功能来解决冲突问题,而不需要使用命名空间。

总之,在 TypeScript 中使用模块和命名空间时,应该优先考虑使用模块来组织和管理代码,使用模块化语法来导入和导出模块中的内容,避免使用命名空间来组织代码和解决命名冲突

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeScript中的模块与命名空间 的相关文章

  • 粘性页脚不粘在 AngularJS 中

    Im working an angular site and im trying to implement a sticky footer across all views but the footer stops sticking whe
  • 仅当 url 以 www 为前缀时才会发生 CORS 错误

    我目前遇到一个关于 CORS 跨源资源共享 的问题 奇怪的是 只有当我使用 www url 前缀时 才会出现这种情况 例如 当我使用以下网址访问我的网站时 http example com index http example com in
  • 在选择下拉列表中选择特定选项时添加输入框

    我需要在选择选项时将输入添加到选择选项中 每当用户选择 其他 时 就会出现一个输入框供用户输入数据 HTML
  • console.log 是如何工作的?

    第一个例子 在以下示例中 http jsfiddle net maniator ScTAW 4 http jsfiddle net maniator ScTAW 4 我有这个js var storage function var store
  • 单击元素外部时触发事件的指令

    我知道有很多问题都在问类似的事情 但没有人真正解决我的问题 我正在尝试构建一个指令 当鼠标单击当前元素外部时 该指令将执行表达式 为什么我需要这个功能 我正在构建一个应用程序 在这个应用程序中 有 3 个下拉菜单 5 个下拉列表 如选择的
  • 获取 Firebase AngularFire 中项目的索引 ID

    这里提出了类似的问题 但接受的答案并没有真正回答这个问题 使用 AngularFire 是否可以创建关系型数据库 或者访问 UniqueID https stackoverflow com questions 16879484 using
  • 如何按日期升序对对象进行排序?

    如果我有一个对象列表 var objectList LIST OF OBJECT each object列表中包含三个属性 name date gender 如何按 对列表中的对象进行排序date 属性升序 the date 属性包含字符串
  • 需要将焦点放在react中的div上

    我有一个之前用 H1 标签包裹的文本 页面加载后 我需要专注于该文本 为了方便起见 我将它包装在 div 中 render const translate billing primaryContactSelection true this
  • 使用 System.js 导入 Typescript 编译的模块时出错

    我最近正在学习使用 system js 导入由 Typescript 编译的模块 这些模块之前是为 require js 编译的 并且工作正常 但是合并到system js时 应用时无法导入模块系统生产 js 控制台说 Uncaught i
  • EaselJS Alpha 遮罩滤镜

    我对 Canvas 还很陌生 我一直在尝试将图像颠倒过来EaselJS Alpha 蒙版 http www createjs com demos easeljs alphamaskreveal示例 以便初始图像清晰 并且您可以paint是模
  • 如何实现 chromecast 对 html5 播放器的支持

    我使用js和html5设计了一个具有一些自定义功能的html5播放器 现在我需要在html5播放器上添加chromecast选项 例如https raw githubusercontent com kim company videojs c
  • 在成功回调之前修改 JSONP 结果

    我想从外部服务加载一些 JSON 数据 然而 它提供 foo bar useful 而我真正关心的是 有用 的部分 我需要将那部分传递给success打回来 我正在尝试使用Deferred一次从多个数据源加载 类似this https st
  • 如何控制谷歌地图标记的不透明度

    我需要根据时间使一些标记半透明 有什么方法可以控制标记的 CSS 不透明度吗 或者是否可以可靠地找出标记的 DOM 元素 我使用 Google 地图 API v3 标记的不透明度可以设置为marker setOptions opacity
  • 如何使 CSS 动画/过渡以固定速度而不是固定持续时间播放? [复制]

    这个问题在这里已经有答案了 我有一个 CSS 动画 可以使元素沿直线移动未定义的距离 据我所知 动画具有固定的持续时间 因此无论元素必须移动多远 动画始终需要相同的时间来运行 我该如何制作才能使动画没有固定的duration 但有固定的运动
  • 如何创建浏览器插件?

    我必须创建一个插件 当用户将鼠标悬停在某些术语上时 该插件必须显示信息 谁能告诉我如何做的方向 我对创建插件没有太多想法 我知道我想要做的事情可以通过java脚本来完成 但是java脚本文件可以作为浏览器插件安装吗 任何对此的想法将不胜感激
  • 如何选中表格中输入文本焦点上的复选框

    我试图在输入文本焦点上检查表 DOM 中的复选框 但无法访问复选框元素 但我的焦点正在工作 这是我的 jsfiddle 链接https jsfiddle net 9qha9vft https jsfiddle net 9qha9vft 这是
  • 如何使用 jquery 生成并附加随机字符串

    一般性 我想使用 jQuery 或 javascript 将随机字符串附加到元素的属性 规格 我需要引用 CDN 上的 CSS 文件 不幸的是 每次更新该 CSS 文件时 CDN 都会更改该文件的 URL 所以我不能简单地引用静态 URL
  • javascript初学者:在javascript中添加动态样式? [复制]

    这个问题在这里已经有答案了 可能的重复 如何使用 Javascript 创建 标签 https stackoverflow com questions 524696 how to create a style tag with javasc
  • 如何从 vue 组件调用 App.vue 中的方法

    我有一个 vue 组件和一个 vue 元素声明 如下所示 Vue component todo item template li This is a todo li methods test function I am getting an
  • 使用 Javascript 删除字符串的最后一个字符

    我有一个DIV与一些字符 如何在每次单击时删除文本中的最后一个字符DIV itself 删除第一个字符 div on click function this text function index text return text repl

随机推荐

  • (个人)AR电子书系统创新实训中期总结

    AR电子书项目实训中期总结 已完成内容 使用ZXing Net库 验证并测试Unity中生成和识别二维码的功能 使用Unity自带的WWW类测试并实现了本地图像和视屏资源的读取 并使用File方法实现了资源的写入 通过www读入本地文件 p
  • Vue项目运行时报错These relative modules were not found

    Vue项目运行时报错These relative modules were not found ERROR Failed to compile with 2 errors These relative modules were not fo
  • 用git,clone依赖的库

    git clone https github com influxdata influxdb java git cd crfasrnn git submodule update init recursive 或 git clone recu
  • 汇编程序debug成功但不能直接运行

    王爽 汇编语言 实验10中的dtoc子程序 运行不了 但是单步调试可以通过并且结果正常 我的代码如下 assume cs code data segment db 10 dup 0 data ends code segment start
  • 标注转换与编辑软件

    标注转换与编辑软件 https github com Fafa DL LabelConvert 1 支持XML转JSON XML转TXT TXT转XML JSON转XML 2 XML JSON类别替换 3 XML JSON类别删除 该Git
  • 《软件测试的艺术》第3章:代码检查、走查与评审

    软件测试的艺术 软件开发人员通常不会考虑到的一种测试形式 人工测试 大多数人认为 因为程序是为了供机器执行而编写的 那么也应由机器来对程序进行测试 这种想法是有问题的 人工测试方法在暴露错误方面是很有成效的 实际上 大多数的软件项目都应使用
  • 100天精通Python(数据分析篇)——第75天:Pandas数据预处理之数据标准化

    文章目录 专栏导读 1 数据标准化是什么 2 数据标准化的作用 3 数据标准化的方法 4 离差标准化 5 标准差标准化 6 小数定标标准化 书籍介绍 专栏导读
  • Python 模块中的变量

    模块 module 其实就是py文件 里面定义了一些函数 类 变量等 包 package 是多个模块的聚合体形成的文件夹 里面可以是多个py文件 也可以嵌套文件夹 库是参考其他编程语言的说法 是指完成一定功能的代码集合 在python中的形
  • 第十四届蓝桥杯模拟赛第一期试题【Java解析】

    目录 A 二进制位数 问题描述 答案提交 参考答案 解析 B 晨跑 问题描述 答案提交 参考答案 解析 C 调和级数 问题描述 答案提交 参考答案 解析 D 山谷 问题描述 答案提交 参考答案 解析 E 最小矩阵 问题描述 答案提交 答案
  • css 栅格布局el-row(xs,sm,md,lg,xl)

    xs 12 24 12 2 所以当屏幕尺寸 lt 768px时 手机 每行展示2个div class com item sm 8 24 8 3 所以当屏幕尺寸 gt 768px时 平板 每行展示3个div class com item md
  • spark.ml支持算法总结

    文章目录 spark支持算法总结 推荐模型 协同过滤 分类模型 1 逻辑回归 2 决策树 3 朴素贝叶斯 4 随机森林 5 梯度提升决策树回归 6 多层感知器分类 7 一对多分类 8 支持向量机 回归模型 1 线性回归 2 广义线性模型 3
  • F1值(F-Measure)、准确率(Precision)、召回率(Recall)简单理解

    准确率与召回率 Precision Recall 准确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值 用来评价结果的质量 准确率 Precision Precision是检测出某类特征的数量与检测出的所有特征数量之间的比率 衡量的
  • 开放-封闭原则(The Open-Closed Principle)

    1 定义 软件实体 类 模块 函数等等 应该是可以扩展的 但是不可修改的 开放 封闭原则主要体现在两个方面 对扩展开放 意味着有新的需求或变化时 可以对现有代码进行扩展 以适应新的情况 对修改封闭 意味着一旦设计完成 就可以独立完成其工作
  • Python编程新手看过来,如何求素数 (Python学习教程)

    本期的Python学习教程是针对新入门Python编程的新手来写的 关于怎么求素数 一 什么是素数 素数就是质数 通俗点说就是只能被1和其本身整数的数就是素数 1除外 举个例子 2 3 4 5 6当中 根据上面的定义 2只能被1整数 因为任
  • JAVA学习笔记(二)浮点数与精确计算

    浮点数分为float 单精度浮点数 和double 双精度浮点数 float取值范围是4字节32位 精度是7到8位 double取值范围是8字节64位 精度是16到17位 数据转化时会有精度的损失 所以通过BigDecimal类将浮点数转化
  • hive 写入mysql 覆盖_一文搞定hive之insert into 和 insert overwrite与数据分区

    版权声明 本文为博主原创文章 未经博主允许不得转载 数据分区 数据库分区的主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间 主要包括两种分区形式 水平分区与垂直分区 水平分区是对表进行行分区 而垂直分区是对列进行分区 一般
  • Android的ListView控件的常用适配器

    ListView的常用适配器 一 ArrayAdapter适配器 1 创建ListView 2 创建用于加载数据的布局 3 java的逻辑代码 使用GridView 以多列的方式排列 处理GridView的逻辑代码 二 SimpleAdap
  • pfx证书转pem、crt、key

    今天测试端的服务器突然不能下载苹果APP了 经查看 发现原来是测试环境的https证书过期了 需要更换证书 于是赶紧从阿里云更新我们的最新证书 我们程序部署在tomcat上 于是下载tomcat版本 下载完成后如下 我们的程序部署在天翼云上
  • adb命令

    adb screenshot2 aapt monitor uiautomatorviewer等命令都在Android SDK的tools platform tools build tools下面 如果希望直接运行命令 不写绝对路径 请把相应
  • TypeScript中的模块与命名空间

    一 模块 在TypeScript中 模块是一种组织和封装代码的方式 模块使得代码可以按照特定的规则划分为不同的文件 并且可以在这些文件之间进行导入和导出 从而实现代码的重用和组织 1 默认导入导出 默认模块导出是一种特殊的导出语法 在一个模