命名空间

命名空间能有效避免全局污染。在ES6引入模块之后,命名空间就较少被提及了。如果使用了全局的类库,命名空间仍是一个好的解决方案。

namespace Shape{const pi = Math.PI;// 使用export关键字导出,可以在全局空间内可见export function circle(r: number) {return pi * r ** 2}square(5)
}
Shape.circle(10); // 可以在全局空间访问导出的
import circle = Shape.circle; // 为命名空间内的变量起个别名,要清楚此处import与模块化的import含义不一样
circle(20);

随着程序的扩张,命名空间也会很大,需要对其进行拆分,在不同的文件中使用同名命名空间,他们之间共享命名空间。

// space1.ts
/// <reference path="space2.ts" />  // 三斜线引用标签告诉编译器,两个文件中的命名空间内部存在着依赖关系
namespace Shape{export function square(x: number) {return x*x;}circle(10); // 只有circle被export后,这里才能访问
}// space2.ts
/// <reference path="space1.ts" />
namespace Shape{const pi = Math.PI;// 使用export关键字导出,可以在全局空间内可见export function circle(r: number) {return pi * r ** 2}square(5);
}

命名空间最好不要和模块一起混用

模块化系统

TypeScript对ES6和CommonJS两种模块系统都有很好的支持,我们基本可以沿用以前的写法。但两者不要混用,如果出现混用,就要使用TS准备的兼容性写法。

先来看看ES6和CommonJS各自的写法

// ES6导入
import { a, b } from './Modular System/es6/a';
import { a as f } from './Modular System/es6/a';
import * as All from './Modular System/es6/a';
import abc from './Modular System/es6/b';
import Obj from './Modular System/es6/a'
// ES6导出
export defalut Obj;
export {a,b,c};
export {d as D};
export {D as C}  from './a'; // 将a.ts中的D重新命名并导出,这种用法只能对a.ts中的非默认导出有效// CommonJS导入
let c1 = require('./Modular System/node/a.ts');
let c2 = require('./Modular System/node/b');
// CommonJS导出
module.exports = a;  // 将a变量导出
exports.c = 3;
exports.d = 4;
相当于
module.exports = {c:3, d:4}
如果两种方式并存,module.exports将会覆盖exports.c这种方式的导出

两种模块在导入导出时互不兼容:

  • 导出:ES6允许同时存在export default和export多个变量,而CommonJS只允许有一种形式的导出,其中一种会把另外一种覆盖掉。
  • 导入:ES6可以按需导入也可以全部导入,而CommonJS只能全部导入。

如果在ES6模块中抛出数据,在非ES6模块中导入,就会出现问题。因此尽量不要混用不同的模块化系统。如果迫不得已,可以使用TS提供的兼容性语法:

// 导出
export = a;
// 导入
import c4 = require('../es6/c');
/*
1.如果使用以上方法导出,此文件不允许有其它形式的导出
2.以上形式的导出的数据,不仅可以用以上语法导入,还可以用es6的方式导入。前提是tsconfig.json中的"esModuleInterop":true配置项要开启。
*/

声明合并

编译器会把程序的多个地方具有相同名称的声明合并成一个,这样可以将程序散落在各处的重名声明合并在一起。

例如:

interface StateMerge {x: number,y: string,
}
interface StateMerge {y: string;foo(bar: string[]): string[],
}
// 此时会将两个声明的同名接口成员合并
let stateMerge: StateMerge = {x: 1,y: "15",foo(bar: any) {return bar}
};

如果合并的两个结构内成员重名怎么办?

  • 对于非函数成员,必须类型一致,否则报错。
  • 对于函数成员,会发生重载,重载的顺序按照以下规则。
interface StateMerge {x: number,y: string,foo(bar: number): number; // 4foo(bar: string): string; // 5foo(bar: "b"): number;    // 2
}
interface StateMerge {y: string;foo(bar: string[]): string[], // 3foo(bar: "a"): number,  // 1
}

接口内部按照先后顺序。接口之间,声明在后的接口函数成员排序更靠前。

如果出现自变量,排名最靠前。后面的接口中的排在第一位,前面的接口排在第二位。上述排序如注释所示。

函数和命名空间的合并

function Lib() {
}
namespace Lib{export let version = '1.0'
}
console.log(Lib.version); // 相当于为函数Lib添加了属性

类和命名空间的合并

class C{
}
namespace C{export let state = 1
}
console.log(C.state); // 相当于为类C添加了state属性

此外,还可以为枚举增加属性。

注意:在命名空间与类、函数进行生命合并的时候,一定要将命名空间放在类、函数之后。否则报错。

转载于:https://www.cnblogs.com/V587Chinese/p/11519477.html

TypeScript模块系统、命名空间、声明合并相关推荐

  1. TypeScript 素描 - 模块解析、声明合并

    模块解析 模块解析有两种方式 相对方式  也就是以/或 ./或-/开头的,比如import jq  from "/jq" 非相对方式  比如 import model  from ...

  2. TypeScript学习笔记-声明合并

    类不能和其他的类或者变量合并 /*** 声明合并* 若两个接口中存在相同的参数,那么这些相同的参数必须有相同的类型* 若两个接口中存在相同的函数,那么同名的函数声明都会被当成这个函数的重载,且后面的接 ...

  3. TypeScript(七)泛型、声明合并、扩展阅读

    TypeScript(七)泛型.声明合并.扩展阅读 文章目录 TypeScript(七)泛型.声明合并.扩展阅读 1. 泛型 简单的例子 多个类型参数 泛型约束 泛型接口 泛型类 泛型参数的默认类型 ...

  4. Vue3 + TypeScript 报错:无法找到模块xx的声明文件

    项目背景,把之前的 js 项目 迁移成 Vue3 + ts项目 问题描述: 有一个工具文件my-util.js,原后缀名为 .js,被原封不动迁移到了 ts 项目中,报错 无法找到模块xx的声明文件 ...

  5. rust怎么进入好友的房间_Rust基础知识-模块系统(上)

    当你开始构建一个大项目的时候,你就能体会到把所有代码都写在一个文件里是多么智障了:不仅难以定位负责某一功能的代码,一大片代码直接糊你脸上也觉得头晕. 当然作为一个现代语言,rust也肯定有相应的措施, ...

  6. TS装饰器、混入Mixins、TS模块、命名空间

    装饰器 定义: 装饰器是一中特殊类型的声明,它能够被附加到类,方法,访问器,属性或参数上,用@添加 装饰器本质上还是一个函数,在别的语言中已广泛使用,如: python,但在TS中依旧为一个测试中的版 ...

  7. Rust 1.30带来更多元编程支持,并改进了模块系统

    Rust的最新版本1.30扩展了过程宏,允许它们定义新的属性和类似于函数的宏.此外,它简化了Rust模块系统,使其更加一致.直观. Rust 1.30引入了两种新类型的过程宏,"类属性的过程 ...

  8. 走进Java 7模块系统

    笔者在观看过Devoxx关于Jigsaw的一段演示后,我很兴奋,觉得它应该会是针对复杂类路径版本问题和JAR陷阱等问题的解决方案.开发者最终能够使用他们所期望的任何Xalan版本,而无需被迫使用授权机 ...

  9. webpack前言:前端模块系统的演进

    前端开发和其他开发工作的主要区别,首先是前端是基于多语言.多层次的编码和组织工作,其次前端产品的交付是基于浏览器,这些资源是通过增量加载的方式运行到浏览器端,如何在开发环境组织好这些碎片化的代码和资源 ...

最新文章

  1. vue数组转Excel表格导出
  2. PHP小白学习日程之旅
  3. 阿里云人脸识别公测使用说明
  4. MySQL 连接报错:mysql access denied for user@ip
  5. PEOPLE MANAGEMENT 节选
  6. README.md怎么写比较好
  7. is_file() 和 is_dir()注意事项
  8. 性能与实用兼具 Parallels Desktop 13 for Mac全球首发
  9. 消费型保险PK返还型保险
  10. 案例:恒丰银行——大数据实时流处理平台
  11. Macromedia FlashPaper
  12. app开发快速理解——webview网页显示
  13. 短信通知-阿里大鱼 申请AK 发送Until
  14. 转载:图像抠图算法学习 -Shared Sampling for Real-Time Alpha Matting
  15. File `xx.sty‘ not found——LaTex解决方案
  16. python打开zip文件_Python操作Zip文件
  17. 入侵与模拟攻击(BAS)——新兴的安全防护有效性验证评估技术
  18. 周志华Boosting25年(一)
  19. Windows10 无法识别手机MTP问题
  20. 计算机网络技术主要包括计算机技术和什么,《计算机网络技术》第6章作业的参考答案...

热门文章

  1. 单片机c语言正弦计算器,求一个 89C51 简易计算器的c语言程序 只要加减乘除就行!...
  2. tensorflow 1.X迁移至tensorflow2 代码写法
  3. awr报告分析 mysql_4个MySQL优化工具,帮你准确定位数据库瓶颈!
  4. jsp或servlet依赖范围不能省略原因
  5. 【算法竞赛学习】金融风控之贷款违约预测-赛题理解
  6. 动态调用类 java_Java动态调用类中方法
  7. 计组—浮点数表示和运算
  8. org.apache.hadoop.hdfs.server.namenode.SafeModeException
  9. 精心整理吐血推荐的AUTOSAR科普介绍材料
  10. 【三分钟讲清区块链/比特币】之二:比特币入门教程