博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TypeScript基础入门之装饰器(一)
阅读量:7186 次
发布时间:2019-06-29

本文共 1676 字,大约阅读时间需要 5 分钟。

hot3.png

转发 

介绍

随着TypeScript和ES6中Classes的引入,现在存在某些场景需要额外的功能来支持注释或修改类和类成员。

装饰器提供了一种为类声明和成员添加注释和元编程语法的方法。
装饰器是JavaScript的第2阶段提案,可作为TypeScript的实验性功能使用。

注意: 装饰器是一种实验性功能,可能在将来的版本中发生变化。

要为装饰器启用实验支持,必须在命令行或tsconfig.json中启用experimentalDecorators编译器选项:

命令行:

tsc --target ES5 --experimentalDecorators

tsconfig.json:

{    "compilerOptions": {        "target": "ES5",        "experimentalDecorators": true    }}

装饰器

装饰器是一种特殊的声明,可以附加到类声明,方法,访问器,属性或参数。

装饰器使用@expression形式,其中expression必须求值为一个函数,该函数将在运行时调用有关装饰声明的信息。

例如,给定装饰器,我们可以编写```sealed```函数,如下所示:

function sealed(target) {    // do something with 'target' ...}

注意: 您可以在下面的类装饰器中看到更详细的装饰器示例。

装饰器工厂

如果我们想自定义装饰器如何应用于声明,我们可以编写一个装饰器工厂。

装饰器工厂只是一个函数,它返回装饰器在运行时调用的表达式。

我们可以用以下方式编写装饰工厂:

function color(value: string) { // this is the decorator factory    return function (target) { // this is the decorator        // do something with 'target' and 'value'...    }}

注意: 您可以在下面的方法装饰器中看到装饰器工厂的更详细示例。

装饰器组成

可以将多个装饰器应用于声明,如以下示例所示:

1. 单行:

@f @g x

2. 多行:

@f@gx

当多个装饰器应用于单个声明时,它们的评估类似于数学中的函数组合。

在该模型中,当组成函数f和g时,得到的复合(f ∘ g)(x)等于f(g(x))。

因此,在TypeScript中评估单个声明上的多个装饰器时,将执行以下步骤:

1. 每个装饰器的表达式都是从上到下进行评估的。

2. 然后将结果从底部到顶部称为函数。

如果我们要使用装饰器工厂,我们可以通过以下示例观察此评估顺序:

function f() {    console.log("f(): evaluated");    return function (target, propertyKey: string, descriptor: PropertyDescriptor) {        console.log("f(): called");    }}function g() {    console.log("g(): evaluated");    return function (target, propertyKey: string, descriptor: PropertyDescriptor) {        console.log("g(): called");    }}class C {    @f()    @g()    method() {}}

运行后输出到控制台如下:

f(): evaluatedg(): evaluatedg(): calledf(): called

未完待续...

转载于:https://my.oschina.net/zhangdapeng89/blog/2250363

你可能感兴趣的文章
matlab绕线式三级串阻,三相绕线式异步电动机转子串电阻起动的MATLAB仿真.docx
查看>>
safe mode php 打开,PHP的Safe_mode 打开后哪些地方受限
查看>>
局部放电 n-q-phi matlab,n-q-phi
查看>>
网站锁定php文件命令,php脚本文件执行锁定代码
查看>>
php如何隐藏,php怎么隐藏标签
查看>>
Oracle员工工资税收,oracle--查询本部门薪水大于平均工资的员工
查看>>
oracle语句更改数据精度,sql – 更改Oracle中数字列的精度
查看>>
oracle 不同列,如何根据所选列而不是Oracle中表的所有列获取不同的行
查看>>
php两个二维数组合并去重复,php二维数组合并及去重复的方法
查看>>
linux建立空文件的命令,linux创建文件命令
查看>>
linux服务器被ddos攻击记录日志,如何快速查看您的Linux服务器是否遭到来自某个IP地址的DDoS攻击...
查看>>
svn配置服务器如何切花Linux,JBMP安装配置过程
查看>>
linux 正序打印日志,通过syslog接收远程日志
查看>>
linux改telnet密码,Ubuntu 12.04 Telnet服务设置
查看>>
linux2017安装包,Linux发行版 KaOS 2017.07 发布,提供最新的Calamares安装程序
查看>>
linux c select tcp异步客户端,这几天在看socket select()实现异步IO的网络聊天室..
查看>>
linux chrome 硬件加速,在Chrome上开启硬件加速和预先渲染的方法技巧
查看>>
linux tar压缩gzip,Linux 压缩 解压命令 tar, gzip, zcat,bzip2, bzcat,compres
查看>>
linux系统安装wine关关采集,在Ubuntu 20.04系统上安装和使用Wine 5的方法
查看>>
i7 6700hq安装linux,联想拯救者E700(i7 6700HQ)如何用u盘装系统win8
查看>>