装饰器

定义:

装饰器是一中特殊类型的声明,它能够被附加到类,方法,访问器,属性或参数上,用@添加

装饰器本质上还是一个函数,在别的语言中已广泛使用,如: python,但在TS中依旧为一个测试中的版本,若要启用实验性的装饰器特性,你必须在命令行或tsconfig.json里启用experimenta1Decorators编译器选项:

添加到类上,类装饰器

添加到方法上,方法装饰器

添加到访问器上,访问器装饰器

添加到属性上,属性装饰器

添加到参数上,参数装饰器

下面这个函数,就可以作为装饰器使用:

function setProp(tartget){
//...
}
@setProp

先定义一个函数,然后这个函数有一个参数,就是要装饰的目标,装饰的作用不同,这个target代表的东西也不同。定义了这个函数之后,它就可以作为装饰器,使用@函数名的形式,写在要装饰的内容前面。

fiInction addAge(constructor: Function) {
constructor.prototype.age = 18;
}
@addAge
class Personf{
name: string;
age: number;
constructorO(){
this.name='xixiao';
}
}
let person = new Person();
consol.log(peroson);//18

这段代码实际上基本等同于:

Person = addAge(function Person(){...})

当装饰器作为修饰类的时候,会把构造器传递进去。constructor.prototype.age就是在每一个实例化对象上面添加一个age值,这里addAge就添加了一个age值。

装饰器工厂

装饰器工厂也是一个函数,它的返回值是一个函数,返回的函数作为装饰器的调用函数。如果使用装饰器工厂,那么在使用的时候,就要加上函数调用。如下:

function setProp(){return function(target){//...}
}
@setProp()

1.类的装饰器

  • 类装饰器就在类声明之前被声明

  • 类装饰器被应用于类的构造函数,可以用来观察、修改或替换类定义

  • 类装饰器不能用在声明文件中(.d.ts),也不能用在任何外部上下文中(比如declare的类)

  • 类装饰器表达式会在运行时当做函数被调用,类的构造函数作为其唯一的参数

  • 如果类装饰器返回一个值,它会使用提供的构造函数类替换类的声明

export default{}
// 定义装饰器
// function testDecorator(constructor:any){
//     constructor.prototype.uname="张杰"
//     constructor.prototype.show=()=>{
//         console.log(`我是${ constructor.prototype.uname}`);//     }
// }
// 工厂函数
// 装饰器工厂也是一个函数,它的返回值是一个函数,返回的函数作为装饰器的调用函数。如果使用装饰器工厂,那么在使用的时候,就要加上函数调用function testDecorator(flag:boolean){if (flag) {return function(constructor:any){constructor.prototype.uname="张杰"constructor.prototype.show=():void=>{console.log(`我是${ constructor.prototype.uname}`);}}} else {return function(constructor:any){constructor.prototype.show=():void=>{console.log("hello world");}}}}
@testDecorator(true)
class  Person{}
let p = new Person();
(p as any).show()

混入Mixins

介绍:除了传统的面向对象继承方式,还流行一种通过可重用组件创建类的方式,就是联合另一个简单类的代码。你可能在Scala等语言里对mixins及其特性已经很熟悉了,但它在JavaScript中也是很流行的。

作用:解决TS中继承一次只能继承一个类的问题

注意点:类的混入不能混入属性名

TS模块

TypeScript 模块的设计理念是可以更换的组织代码。

模块是在其自身的作用域里执行,并不是在全局作用域,这意味着定义在模块里面的变量、函数和类等在模块外部是不可见的,除非明确地使用 export 导出它们。类似地,我们必须通过 import 导入其他模块导出的变量、函数、类等。

两个模块之间的关系是通过在文件级别上使用 import 和 export 建立的。

模块使用模块加载器去导入其它的模块。 在运行时,模块加载器的作用是在执行此模块代码前去查找并执行这个模块的所有依赖。 大家最熟知的JavaScript模块加载器是服务于 Node.js 的 CommonJS 和服务于 Web 应用的 Require.js。

此外还有有 SystemJs 和 Webpack。

import Test = require('./muduleTest');
​
class Person implements Test.IPerson{name="刘亦菲"age=19sex = "女"show(){console.log(`我是${this.name},年龄${this.age}`);}
}
let p = new Person();
console.log(p);
p.show()
​
import{obj} from './muduleTest'
console.log(obj);
​​
​
​
export interface IPerson{name:stringage:numbersex:stringshow():void
}
export const obj={name:"李师师"}

命名空间

项目开发过程中,我们会发现我们的命名是有严格规范的,我们不能随意的去起名字,但若是都采用尽量标准化的方式去命名,我们又无法避免的会造成污染,Typescript提供了namespace 避免这个问题出现

  • 在TS1.5之前被叫做内部模块,主要用于组织代码。避免命名冲突

  • 本质就是定义一个大对象,把变量/方法/类/接口...的都放里面

  • 通过 export导出

  • 通过namespace定义

// namespace A{
//     export const a=100
// }
// namespace B{
//     export const a=200
// }
// console.log(A.a);
// console.log(B.a);
​
// 嵌套命名空间
namespace B{export const b=1000export namespace C{export const c=2000}
}
​
console.log(B.b);
console.log(B.C.c);
​
// 简化命名空间
import c = B.C.c
console.log(c);
​
​
import{ D } from "./namespace"
console.log(D.d);
​
export namespace D{export const d = 2300
}

TS装饰器、混入Mixins、TS模块、命名空间相关推荐

  1. 理解TS装饰器Decorator

    理解TS装饰器Decorator 介绍 类装饰器 方法装饰器 介绍 详细的关于ts中装饰器的使用和语法可以参考 ts官网中decorator这一章节,或者阮一峰的ts教程的decorator章节这里这 ...

  2. 代码缺乏装饰?使用ts装饰器来装饰你的代码

    TypeScript中的装饰器

  3. JS中bind、call和apply的作用以及在TS装饰器中的用法

    目录 1,前言 1,call 1.1,例子 1.2,直接调用 1.3,将this指向另一个对象 1.4,传递参数 2,apply 2.1,例子 2.2,直接调用 2.3,将this指向另一个对象 2. ...

  4. python面试充电(3)面向对象、装饰器、包与模块

    面向对象 关于面向对象解读,参考知乎一个回答https://www.zhihu.com/question/20275578/answer/26577791 python里面类其本质就是为了封装.把对象 ...

  5. csrf跨站请求伪造,CBV添加装饰器,auth认证模块,基于django中间件设计项目功能

    文章目录 csrf跨站请求伪造 csrf的定义 csrf的分类 csrf的攻击过程 csrf的攻击条件 举例说明 Django提供的解决策略 csrf相关装饰器 FBV CBV 方法一(直接在类中的某 ...

  6. python装饰器及functools模块

    python装饰器及functools模块 本文是笔者学习python装饰器以及functools模块的笔记. 在开始学习之前,先在此列举出python函数的一些特性: 一切皆对象:python函数也 ...

  7. vuex-module-decorators装饰器的使用

    vuex-module-decorators 官网 安装 npm install vuex-module-decorators # or yarn add vuex-module-decorators ...

  8. Decorators TypeScript 装饰器

    Decorators 装饰器(Decorator)用来增强 JavaScript 类(class)的功能,许多面向对象的语言都有这种语法,目前有一个提案将其引入了 ECMAScript. 装饰器是一种 ...

  9. 人人都能看懂的 Python 装饰器入门教程

    大家好,我是萱萱! 之前的文章中提到,很多人认为理解了装饰器的概念和用法后,会觉得自己的 Python 水平有一个明显的提高. 但很多教程在一上来就会给出装饰器的定义以及基本用法,例如你一定会在很多文 ...

最新文章

  1. 第五次作业 何雅
  2. CentOS 6.9下配置安装KVM
  3. 「分布式」艺术创作:20分钟+1080显卡,这个AI就能创造复杂作品 | 开源
  4. OpenCV学习:播放avi视频文件
  5. 全世界的狗都没有“生殖隔离” | 今日趣图
  6. 基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作
  7. 博客诞生过程与变革:十年来谁是写博客第一人?
  8. 一同事恶搞static
  9. 扩展欧几里得算法及其简单应用
  10. appleId登录java
  11. button加下划线
  12. mac宽带连接找不到pppoe服务器,mac苹果电脑如何建立PPPoE拨号连接上网
  13. 怎样学习Peoplesoft -byl vhonglei
  14. 紫外线杀菌器:紫外线杀菌的原理分析
  15. python 显示gif_PyQt5显示GIF图片的方法
  16. SpringCloud核心组件概述(五大神兽)
  17. Vue商城——首页功能
  18. 支持OneNote for Window10代码高亮工具
  19. 天地图加载慢 快速打开天地图
  20. iOS 模态视图,阻尼动画

热门文章

  1. HDMI 1.4 协议详解
  2. Java Condition类使用及分析
  3. 谁在用琵琶弹奏一曲东风破
  4. 基于 HTML5 的工业组态高炉炼铁 3D 大屏可视化
  5. tesseract 遇到的一些问题
  6. 推荐一个优秀的c++源代码,TinyXml2
  7. 【转载】蚂蚁金服异地多活的微服务体系
  8. 网上书店管理系统mysql代码_网上书店管理系统数据库数据库
  9. 让IE9及以上兼容es6,Promise, 及es7的async await
  10. 每日一学 | 2021-05-19 | Power BI 学习笔记03、04