1、模块的概念

内部模块类似于命名空间,外部模块才简称为模块
模块在自身作用域内起作用,不能在全局作用域中使用(被导出是例外)
模块内的变量,函数,类在模块外不可见,可以通过export导出。然后在其他地方使用import导入

因此
可以把公共功能抽离成一个文件作为模块
模块内的变量,函数,类等默认是私有的,并通过export向外暴露,暴露后通过import导入。

1、创建模块文件db.ts

export let dbURL = 'xxxxx';
//获取数据库数据
export function getData(): any[] {console.log('获取数据库的数据');return [{ title: 'xxtitlexx' },{ title: 'xxtitlexx' },];
}export function save(): void { console.log('保存数据成功');}

2、导入并使用模块文件db.ts
index.ts

import { getData,save,dbURL } from './modules/db'
const myarr = getData()
save();
console.log(myarr);

3、在node环境下运行
在浏览器中无法支持,需要在node环境下执行编译后的index.js

node index.js

2、模块的导出

  • 在暴露过程中可以集中暴露,直接以对象形式进行暴露,上例模块部分可以写成
let dbURL = 'xxxxx';
//获取数据库数据
function getData(): any[] {console.log('获取数据库的数据');return [{ title: 'xxtitlexx' },{ title: 'xxtitlexx' },];
}function save(): void { console.log('保存数据成功');}
export { dbURL,getData,save}
  • export的时候也可以使用as关键字,未某个导出的方法或属性起别名
export { dbURL,getData as get,save}

在import的时候则只能使用别名,而不能使用原名称

  • 只有一个方法的时候可以使用默认导出export default
 export default function myfun(){}


在已经写好方法体的情况下

 export default  myfunimport myfun from 'xxxxx'

注意,export default在单个模块中只能使用一次

3、使用命名空间

命名空间:内部模块,主要用于组织代码,避免命名冲突
模块:ts的外部模块的简称,侧重代码的复用,一个模块里可能有多个命名空间
大致与java的命名空间一致
命名空间内的变量、函数、类等要使用export导出

namespace A { export class Dog { }
}
namespace B { export class Dog { }
}let d1 = new A.Dog();
let c1 = new B.Dog();

4、导出、导入命名空间

1、创建命名空间文件db.ts

export namespace A { export class Dog { name: string;constructor(name:string) {this.name = name;}sing() { console.log(`${this.name} is singing a song`);}}
}
export namespace B { export class Dog { }
}

2、导入命名空间

import { A,B } from './modules/db'let d1 = new A.Dog('zhagnsan');
let c1 = new B.Dog();
d1.sing()

5、装饰器

  • 装饰器是一种特殊类型的声明,能够被附加到类声明、方法、属性或参数上,可以修改类的行为
  • 通俗讲装饰器就是一个方法,可以注入到类、方法、属性参数上来扩展类、属性、方法、参数的功能。
  • 常见的装饰器有:类装饰器、属性装饰器,方法装饰器、参数装饰器
  • 装饰器的写法:普通装饰器(无法传参),装饰器工厂(可传参)
  • 装饰器是过去几年js最大的成就之一,已是es7的标准特性之类

6、类装饰器

类装饰器在类声明之前被声明(紧靠着类声明)。
类装饰器应用于类构造函数,可以用来监视,修改或替换类定义。传入一个参数

//声明一个装饰器,和函数声明一样
function logClass(params: any) {console.log(params);//params就是被修饰的类//给被装饰的类原型进行扩展params.prototype.apiUrl = 'myapiurl';//扩展了原型,增加了apiUrl属性params.prototype.run = function () { console.log('i am a method of running');}}//使用@表示调用装饰器
@logClass
class HttpClient { constructor(){ }getData() { }
}@logClass
class Person{ constructor() { }work() { }
}let p1: any = new Person();
let h1:any = new HttpClient();
console.log(p1.apiUrl, h1.apiUrl);
p1.run();
h1.run();

7、装饰器工厂(可传参)

这里有两个参数,一个是装饰器本身的参数,接收设计者传入的参数,一个是工厂返回的函数参数,接收被装饰类
//声明一个装饰器,和函数声明一样
function logClass(params: any) {//返回一个函数,这里的target是从被装饰类中返回过来的参数,成为一个装饰器工厂return function (target: any) { console.log(params);console.log(target);target.prototype.apiUrl = params;}}//使用@表示调用装饰器
@logClass('http://www.sina.com')//表示把hello赋给了装饰器的params,把整个类赋值给了target
class HttpClient { constructor(){ }getData() { }
}let h1:any = new HttpClient();
console.log(h1.apiUrl);

8、装饰器修改类构造函数

类装饰器表达式会在运行时当作函数被调用,类的构造函数作为其唯一的参数。
如果类装饰器返回一个值,它会使用提供的构造函数来替换类的声明

//声明一个装饰器,和函数声明一样
function logClass(target: any) {console.log(target);//返回一个匿名类,并且继承了target类,注意要重载父类的所有属性和方法return class extends target { //修改apiUrl,实际是是要apiUrl: any = '我是修改后的数据';getData() { console.log(this.apiUrl+'---');}}}//使用@表示调用装饰器
@logClass
class HttpClient {public apiUrl: string | undefined;constructor(){ this.apiUrl = '我是构造函数里面的apiurl';}getData() { console.log(this.apiUrl);}
}let h1:any = new HttpClient();
h1.getData()

9、属性装饰器

属性装饰器表达式会在运行时当作函数被调用,传入下列2个参数
1、对于静态成员来说是类的构造函数,对于实例成员是类的原型对象
2、成员的名字

//声明一个类装饰器,和函数声明一样
function logClass(params: any) {//返回一个函数,这里的target是从被装饰类中返回过来的参数,成为一个装饰器工厂return function (target: any) { target.prototype.apiUrl = params;}}
//声明一个属性装饰器
function logProperty(params: any) { //返回一个函数,要接收两个参数return function (target: any, attr: any) { console.log(target);console.log(attr);target[attr] = params;}
}
//使用@表示调用装饰器
@logClass('http://www.sina.com')//表示把hello赋给了装饰器的params,把整个类赋值给了target
class HttpClient { //使用属性装饰器@logProperty('http://sohu.com.cn')public url: any | undefined;constructor(){ }getData() { console.log(this.url);}
}
let h1 = new HttpClient();
h1.getData()

10、方法装饰方法器(增加类属性及类方法)

会被应用到方法的属性描述符上,可以用来监视、修改或替换方法定义

方法装饰会在运行时传入下列3个参数:
1、对于静态成员来说是类的构造函数,对实例成员是类的原型对象
2、成员的名字
3、成员的属性描述符

//声明一个装饰器
function get(params: any) { //返回一个函数,要接收两个参数return function (target: any,methodName:any,desc:any) { console.log(target);console.log(methodName);console.log(desc);//为方法扩展属性target.apiUrl = 'http://www.baidu.com';target.run = function () { console.log(' my method is run ');}}
}
class HttpClient { public url: any | undefined;constructor(){ }//为方法添加自定义的get装饰器@get('http://www.sina.com')getData() { console.log(this.url);}
}
let h1:any  = new HttpClient();
console.log(h1.apiUrl);
h1.run();

11、方法装饰器修改类的方法

//声明一个装饰器
function get(params: any) { //返回一个函数,要接收两个参数return function (target: any,methodName:any,desc:any) { console.log(target);console.log(methodName);console.log(desc.value);//修改被装饰类的方法,把装饰器方法里面传入的所有参数改为string类型//1、保存当前的方法let oMethod = desc.value;desc.value = function (...args:any[]) { args = args.map((value) => {return String(value);})console.log(args);oMethod.apply(this, args);}}
}
class HttpClient { public url: any | undefined;constructor(){ }//为方法添加自定义的get装饰器@get('http://www.sina.com')getData(...args:any[]) { console.log(args);console.log('我是getData里面的方法');}
}
let h1:any  = new HttpClient();
h1.getData(123,'xxxx');

12、方法参数装饰器

参数装饰器表达式会在运行时当作函数被调用,可以使用参数装饰器为类的原型增加一些元素数据,传入下列3个参数:
1、对于静态成员来说是构造函数,对于实例成员来说是原型对象
2、参数的名字
3、参数在函数参数列表中的索引。

//定义一个方法参数装饰器
function logParams(params: any) { //返回一个函数,要接收3个参数,target是原型对象,methodName是方法名称,paramsIndex参数索引return function (target: any,methodName:any,paramsIndex:any) { console.log(target);console.log(methodName);console.log(paramsIndex);//在装饰器上对原型添加一些数据target.apiUrl  = params;}
}
class HttpClient { public url: any | undefined;constructor(){ }//在方法的参数中调用装饰器getData(@logParams('xxxxx') uuid:any) { console.log(uuid);}
}
let h1:any  = new HttpClient();
h1.getData(123456);
console.log(h1.apiUrl);

13、装饰器的执行顺序

属性>方法>方法参数>类装饰器
如果有同样的装饰器,则先执行后面的。

it营Typescript学习笔记02(基础完结)模块,命名空间,装饰器相关推荐

  1. Typescript学习笔记(五) 模块机制

    javascript从es5之前都缺少一种模块机制,无法通过js引入文件,于是requirejs等等的加载器应运而生.这些加载器的使用也并不统一,产生了amd,commonjs,umd等等的规范,各有 ...

  2. JavaScript学习笔记02【基础——对象(Function、Array、Date、Math)】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  3. C基础学习笔记——01-C基础第02天(用户权限、VI操作、Linux服务器搭建)

    在学习C基础总结了笔记,并分享出来.有问题请及时联系博主:Alliswell_WP,转载请注明出处. 01-C基础第02天(用户权限.VI操作.Linux服务器搭建) 打开终端:ctrl+alt+t ...

  4. 【计算机图形学基础】学习笔记 02 图形系统

    [计算机图形学基础]学习笔记 02 图形系统 一张图概括基本内容. 思维导图 References [1] 徐文鹏, 都伟冰, 等.计算机图形学基础:OpenGL版(第二版)[M].北京:清华大学出版 ...

  5. GDAL学习笔记02:GDAL基础知识

    你的习惯决定了你会成为什么样的人. GDAL学习笔记02:GDAL基础知识 前言 1. 版本 2. 摘要 3. 说明 4. 微信公众号GISRSGeography 一.GDAL简介 二.导入GDAL ...

  6. TypeScript学习笔记2:数据类型

    TS 和 JS 相对比的优势 TypeScript的安装步骤.运行问题及代码的简单运行 TypeScript学习笔记1:变量赋值及书写方式 TypeScript学习笔记2:数据类型 文章目录 数据类型 ...

  7. XML学习笔记02【xml_解析】

    Java后端 学习路线 笔记汇总表[黑马程序员] XML学习笔记01[xml_基础.xml_约束][day01] XML学习笔记02[xml_解析][day01] 目录 03 xml_解析 xml_解 ...

  8. MySQL学习笔记02【SQL基本概念与通用语法、数据库的CRUD操作】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  9. Python入门学习笔记1-Python基础

    Python入门学习笔记1-Python基础 前言:本文介绍了Python学习的前导知识概念以及必记基础函数,如善用help方法查看帮助文档,以及内置对象类型的概念以及常用函数的详解. 一.Pytho ...

  10. Easy EDA #学习笔记02# |Arduino UNO 单片机最小系统PCB原理图 (ATMEGA328P单片机 AMS1117芯片5V转3.3V )

    3D模型图 顶层 丝印层 阻焊层(绿油) 锡膏层 铜箔层 基板 - 原理图符号自动编号:[设置]-[系统设置]-[原理图]选项 铜柱M3: 原理图原点设置: Crl + A 拖动 [放置]-[画布原点 ...

最新文章

  1. eclipse中安装使用Gradle构建工具
  2. ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新(转载)
  3. 东京见闻:快速走红日本市场 阿里云的三大秘密
  4. 1032:大象喝水查
  5. async 和 await 的进阶
  6. 一个测试新人的职业规划——三个月
  7. 2017.5.8 飞扬的小鸟 失败总结
  8. Leetcode: Binary Tree Inorder Traversal
  9. Redis服务器被劫持风波
  10. 习题3.8 符号配对 (20 分)
  11. 如何给自己的照片制作水印
  12. STM32小车篇之超声波测距
  13. 如何理解实时频谱分析仪的几个“带宽”参数(1)——实时带宽(RTBW)
  14. PS缩小图层兼如何使用蒙版
  15. 分析10万条弹幕,告诉你《古董局中局2》这部鉴宝题材剧咋样?
  16. Windows 10创建用户
  17. 微信APP支付demo
  18. Vue-DataV 数据可视化工具
  19. php 生成模糊图片
  20. 一文入门车载以太网,吐血整理!不看后悔!

热门文章

  1. php flash斗地主,flash斗地主
  2. 四种优秀的数据库设计工具
  3. LaTeX数学符号汇总
  4. 天天生鲜项目页面——商品列表页
  5. python基础案例教程课后答案_Python基础案例教程
  6. Linux系统下安装es中ik分词器详解
  7. qpsk psk matlab,BPSK和QPSK调制解调原理及MATLAB程序资料
  8. Cisco iOS的两种配置文件(思科命令的保存)
  9. 最受欢迎的Chrome插件Adblock屏蔽网页广告
  10. 傅里叶变换与拉普拉斯变换