it营Typescript学习笔记02(基础完结)模块,命名空间,装饰器
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(基础完结)模块,命名空间,装饰器相关推荐
- Typescript学习笔记(五) 模块机制
javascript从es5之前都缺少一种模块机制,无法通过js引入文件,于是requirejs等等的加载器应运而生.这些加载器的使用也并不统一,产生了amd,commonjs,umd等等的规范,各有 ...
- JavaScript学习笔记02【基础——对象(Function、Array、Date、Math)】
w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...
- C基础学习笔记——01-C基础第02天(用户权限、VI操作、Linux服务器搭建)
在学习C基础总结了笔记,并分享出来.有问题请及时联系博主:Alliswell_WP,转载请注明出处. 01-C基础第02天(用户权限.VI操作.Linux服务器搭建) 打开终端:ctrl+alt+t ...
- 【计算机图形学基础】学习笔记 02 图形系统
[计算机图形学基础]学习笔记 02 图形系统 一张图概括基本内容. 思维导图 References [1] 徐文鹏, 都伟冰, 等.计算机图形学基础:OpenGL版(第二版)[M].北京:清华大学出版 ...
- GDAL学习笔记02:GDAL基础知识
你的习惯决定了你会成为什么样的人. GDAL学习笔记02:GDAL基础知识 前言 1. 版本 2. 摘要 3. 说明 4. 微信公众号GISRSGeography 一.GDAL简介 二.导入GDAL ...
- TypeScript学习笔记2:数据类型
TS 和 JS 相对比的优势 TypeScript的安装步骤.运行问题及代码的简单运行 TypeScript学习笔记1:变量赋值及书写方式 TypeScript学习笔记2:数据类型 文章目录 数据类型 ...
- XML学习笔记02【xml_解析】
Java后端 学习路线 笔记汇总表[黑马程序员] XML学习笔记01[xml_基础.xml_约束][day01] XML学习笔记02[xml_解析][day01] 目录 03 xml_解析 xml_解 ...
- MySQL学习笔记02【SQL基本概念与通用语法、数据库的CRUD操作】
MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...
- Python入门学习笔记1-Python基础
Python入门学习笔记1-Python基础 前言:本文介绍了Python学习的前导知识概念以及必记基础函数,如善用help方法查看帮助文档,以及内置对象类型的概念以及常用函数的详解. 一.Pytho ...
- Easy EDA #学习笔记02# |Arduino UNO 单片机最小系统PCB原理图 (ATMEGA328P单片机 AMS1117芯片5V转3.3V )
3D模型图 顶层 丝印层 阻焊层(绿油) 锡膏层 铜箔层 基板 - 原理图符号自动编号:[设置]-[系统设置]-[原理图]选项 铜柱M3: 原理图原点设置: Crl + A 拖动 [放置]-[画布原点 ...
最新文章
- eclipse中安装使用Gradle构建工具
- ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新(转载)
- 东京见闻:快速走红日本市场 阿里云的三大秘密
- 1032:大象喝水查
- async 和 await 的进阶
- 一个测试新人的职业规划——三个月
- 2017.5.8 飞扬的小鸟 失败总结
- Leetcode: Binary Tree Inorder Traversal
- Redis服务器被劫持风波
- 习题3.8 符号配对 (20 分)
- 如何给自己的照片制作水印
- STM32小车篇之超声波测距
- 如何理解实时频谱分析仪的几个“带宽”参数(1)——实时带宽(RTBW)
- PS缩小图层兼如何使用蒙版
- 分析10万条弹幕,告诉你《古董局中局2》这部鉴宝题材剧咋样?
- Windows 10创建用户
- 微信APP支付demo
- Vue-DataV 数据可视化工具
- php 生成模糊图片
- 一文入门车载以太网,吐血整理!不看后悔!