TypeScript模块系统、命名空间、声明合并

命名空间

命名空间能有效避免全局污染。在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习之 weka学习(五)示例用法

WEKA 开发学习 &#xff1a;源码法分析 http://www.360doc.com/userhome.aspx?userid13256259&cid11# 用 WEKA 进行数据挖掘 http://www.ibm.com/developerworks/cn/opensource/os-weka1/WEKA使用教程 http://blog.csdn.net/yangliuy/article/details/7589306 初试w…

如何在TypeScript中使用JS类库

使用流程 1.首先要清除类库是什么类型&#xff0c;不同的类库有不同的使用方式 2.寻找声明文件 JS类库一般有三类&#xff1a;全局类库、模块类库、UMD库。例如&#xff0c;jQuery是一种UMD库&#xff0c;既可以通过全局方式来引用&#xff0c;也可以模块化引用。 声明文件 当我…

机器学习之 weka学习(六)最大内存

Weka 常见问题处理&#xff1a; weka如何安装支持向量机工具包 方法一、打开 weka&#xff0c;工具栏的Tools–>Package manager,可在里面添加需要的工具包。 方法二、下载 libsvm-**.jar 包&#xff0c;开源的。解压文件夹&#xff0c;里面……\libsvm-3.19\java ,下面有…

使用Jest进行单元测试

Jest是Facebook推出的一款单元测试工具。 安装 npm install --save-dev jest ts-jest types/jest 在package.json中添加脚本&#xff1a; “test”: "jest" 生成Jest配置文件&#xff08;生成jest.config.js&#xff09; npx ts-jest config:init 使用 先简单编写一个…

国外十大高校人工智能实验室及其代表性人物一览

本文转自&#xff1a; http://toutiao.com/a6293031494186107137/?tt_frommobile_qq&utm_campaignclient_share&appnews_article&utm_sourcemobile_qq&iid4325464459&utm_mediumtoutiao_android 高校建立的实验室与大公司有所不同&#xff0c;其研究项目…

pytorch简单框架

网络搭建&#xff1a; mynn.py: import torchfrom torch import nnclass mynn(nn.Module): def __init__(self): super(mynn, self).__init__() self.layer1 nn.Sequential( nn.Linear(3520, 4096), nn.BatchNorm1d(4096), nn.ReLU(True) …

java 基础安装和Tomcat8配置

初识 java&#xff0c;基础安装的说明。 下载 在oracle官网一般在同一个java版本会提供2个版本&#xff0c; 一个是Java SE Development Kit 7u80&#xff0c;此版本包含JDK开发环境版本&#xff1b; 另外一个是 Java SE Runtime Environment 7u80&#xff0c;此为只包含JR…

TypeScript React

环境搭建 我们当然可以先用脚手架搭建React项目&#xff0c;然后手动配置成支持TypeScript的环境&#xff0c;虽然比较麻烦&#xff0c;但可以让你更清楚整个过程。这里比较麻烦&#xff0c;就不演示了&#xff0c;直接用命令配置好。 npx create-react-app appname --typescri…

matlab内存溢出的解决方案

&#xff08;1&#xff09; 增加虚拟内存&#xff1a;cmd -> taskmgr 打开任务管理器&#xff0c;查看物理内存和虚拟内存&#xff0c;可观察matlab在运行过程中是否超过物理内存和虚拟内存。若超过&#xff0c;增加虚拟内存的方法是不可行的。物理内存不足的时候可以通过将…

c++MMMMM:oo

1.union&#xff0c;struct和class的区别 转载于:https://www.cnblogs.com/invisible2/p/11524465.html

matlab调用Java程序时出现 Java.lang.OutOfMemoryErrot: GC overhead limit exceeded

matlab调用Java程序时出现 java.lang.OutOfMemoryError: GC overhead limit exceeded JDK1.6.0_37和JDK_1.7.0_60版本&#xff0c;这2个版本中JVM默认启动的时候-XX:UseGCOverheadLimit&#xff0c;即启用了该特性。这其实是JVM的一种推断&#xff0c;如果垃圾回收耗费了98%的…

[FY20 创新人才班 ASE] 第 1 次作业成绩

作业概况 条目备注作业链接【ASE高级软件工程】热身作业&#xff01;提交人数19未完成人数2满分10分作业情况总结 本次作业作为大家软工课程的第一次作业&#xff0c;完成度相当不错&#xff08;尤其是在国外暑研/赶论文的同学也在尽力完成作业&#xff0c;很感动&#xff09;。…

JVM 参数设置

1、集成开发环境下启动并使用JVM&#xff0c;如eclipse需要修改根目录文件eclipse.ini&#xff1b; 2、Windows服务器下安装版Tomcat&#xff0c;可使用Tomcat8w.exe工具&#xff08;tomcat目录下&#xff09;和直接修改注册表两种方式修改Jvm参数&#xff1b; 3、Windows服务…

从筛选简历和面试流程讲起,再给培训班出身的程序员一些建议

本人最近几年一直在外企和互联网公司承担Java技术面试官的职责&#xff0c;大多面试的是Java初级和高级开发&#xff0c;其中有不少是培训班出身的候选人。 在我之前的博文里&#xff0c;从面试官的角度聊聊培训班对程序员的帮助&#xff0c;同时给培训班出身的程序员一些建议&…

马普所机器学习课程 CMU701

马普所机器学习课程 Max-Planck-Institut fr Informatik: Machine Learning https://www.mpi-inf.mpg.de/departments/computer-vision-and-multimodal-computing/teaching/courses/ 马普所 GVV project http://gvv.mpi-inf.mpg.de/GVV_Projects.html CMU701 Tom Mitchel…

Random Forest 实用经验(转)

总结两条关于random forest的实用经验。给定数据和问题&#xff0c;对于算法选择有参考价值。 小样本劣势&#xff0c;大样本优势 小样本情况下&#xff08;1k~100k&#xff09;&#xff1a; RF相对与经典算法&#xff08;SVM or Boosting&#xff09;没优势&#xff0c;一般…

pytorch 查看中间变量的梯度

pytorch 为了节省显存&#xff0c;在反向传播的过程中只针对计算图中的叶子结点(leaf variable)保留了梯度值(gradient)。但对于开发者来说&#xff0c;有时我们希望探测某些中间变量(intermediate variable) 的梯度来验证我们的实现是否有误&#xff0c;这个过程就需要用到 te…

hbase数据迁移到hive中

描述&#xff1a; 原先数据是存储在hbase中的&#xff0c;但是直接查询hbase速度慢&#xff08;hbase是宽表结构&#xff09;&#xff0c;所以想把数据迁移到hive中&#xff1b; 1.先hbase 和 hive创建 外部表链接&#xff0c; 可以在hive直接查询&#xff1b; 2.利用创建的外部…

weka 学习总结(持续)

机器学习之 Weka学习&#xff08;一&#xff09;weka介绍&#xff0c;安装和配置环境变量 机器学习之 Weka学习&#xff08;二&#xff09;算法说明 Weka数据挖掘处理流程介绍 机器学习之 weka学习&#xff08;五&#xff09;示例用法 Weka数据处理结果分析 http://blog.c…

作为IT面试官,我如何考核计算机专业毕业生?作为培训班老师,我又如何提升他们?...

我最近几年一直在做技术面试官&#xff0c;除了面试有一定工作经验的社会人员外&#xff0c;有时还会面试在校实习生和刚毕业的大学生。同时&#xff0c;我也在学校里做过兼职讲师&#xff0c;上些政府补贴课程&#xff08;这些课程有补贴&#xff0c;学生不用出钱&#xff09;…