reflect-metadata

例子:

import 'reflect-metadata';function validate(target: Object,key: string,descriptor: PropertyDescriptor
) {const originalFn = descriptor.value;// 获取参数的编译期类型const designParamTypes = Reflect.getMetadata('design:paramtypes', target, key);descriptor.value = function (...args: any[]) {args.forEach((arg, index) => {const paramType = designParamTypes[index];const result = arg.constructor === paramType|| arg instanceof paramType;if (!result) {throw new Error(`Failed for validating parameter: ${arg} of the index: ${index}`);}});return originalFn.call(this, ...args);}
}class C {@validatesayRepeat(word: string, x: number) {return Array(x).fill(word).join('');}
}const c = new C();
c.sayRepeat('hello', 2); // pass
c.sayRepeat('', 'lol' as any); // throw an error

方法装饰器里包含的描述器形状如下:

通过反射 API,提取出来的方法参数分别为 String 和 Number:

Reflect.getMetadata 的输入和输出的文档如下:

可见,我们的自定义 validate 函数,一定程度上模拟了 TypeScript 编译器的工作。

就算有开发人员在调用 sayRepeat 方法时,用 as any 的方式绕过了编译器的静态语法检查,在运行时,我们的 @validate 装饰器实现,也会将这种违规的行为检测出来。

更多Jerry的原创文章,尽在:“汪子熙”:

TypeScript reflect-metadata 结合方法装饰器实现的一个自定义语法检查的例子相关推荐

  1. TypeScript系列教程十一《装饰器》 -- 属性装饰器

    系列教程 TypeScript系列教程一<开篇> TypeScript系列教程二<安装起步> TypeScript系列教程三<基础类型> TypeScript系列教 ...

  2. python中的类装饰器应用场景_Python 自定义装饰器使用写法及示例代码

    1.Python装饰器简介 python的装饰器就是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.简单的说装饰器就是一个用来返回函数 ...

  3. python计算时间装饰器_python 写一个计算运行时间的装饰器

    面试题之中的一个. 写一个装饰器wraps,它接收一个參数t.假设函数运行时间超过1秒,输出"bad",否则输出"goods". 首先,计算函数的运行时间: i ...

  4. python装饰器记录每一个函数的执行时间

    下面这段代码中的hello()函数使用装饰器,直接调用hello时,会用装饰器中的print_time的wrapper函数覆盖掉原有的函数,因此实现的功能就是先执行函数,然后打印函数执行的时间 imp ...

  5. python进阶之装饰器之3如何利用装饰器强制函数上的类型检查

    先占坑 转载于:https://www.cnblogs.com/max520liuhu/p/9349358.html

  6. Javascript 装饰器极速指南

    pablo.png Decorators 是ES7中添加的JavaScript新特性.熟悉Typescript的同学应该更早的接触到这个特性,TypeScript早些时候已经支持Decorators的 ...

  7. python(八)装饰器

    摘要 装饰器,在python中在面向过程编程的层面实现了OOP中的"装饰"设计模式!作为高阶函数的一个延生,在python中应用广泛! python中的装饰器,是对"高阶 ...

  8. 使用 TypeScript 自定义装饰器给类的方法增添监听器 Listener

    方法装饰器 语法 type MethodDecorator = <T>(target: Object,propertyKey: string | symbol,descriptor: Ty ...

  9. TypeScript(八)装饰器

    目录 前言 定义 类装饰器 基本用法 操作方式 操作类的原型 类继承操作 方法装饰器 属性装饰器 存取器装饰器 参数装饰器 基本用法 参数过滤器 元数据函数实现 参数过滤 效果实践 装饰器优先级 相同 ...

最新文章

  1. read-sequence的返回值
  2. http文件服务器和ftp文件服务器,http和ftp文件服务器
  3. django 通过数据库表名获取app名
  4. JDK9的JShell简单使用
  5. java.lang.NoSuchMethodError: org.apache.flink.table.api.TableColumn.isGenerated()Z
  6. Map value类型不同的写法
  7. C++ 空字符('\0')和空格符(' ')
  8. pads中如何设置等长_如何在SQL Server中设置扩展,监控系统性能
  9. 无限级分类递归法(超简单)
  10. 解决家庭版win10、win8没有远程桌面选项
  11. MFC CImageList 详解
  12. iMindMap2020 中文旗舰免费版
  13. A Game of Thrones(58)
  14. 【软件分析/静态程序分析学习笔记】3.数据流分析(Data Flow Analysis) (上):可达性分析(Reaching Definitions)
  15. 创意撰写优化技巧通配符
  16. java 自定义标签_Java自定义标签用法实例分析
  17. 为什么重写equals方法必须要重写hashCode方法
  18. 网络表示学习相关资料
  19. 长沙理工大学计算机与通信工程学院院长,徐蔚鸿教授
  20. Android开发:编程实现界面定时刷新

热门文章

  1. ASP.NET CORE MVC 2.0 如何在Filter中使用依赖注入来读取AppSettings
  2. 学数据结构,仅仅须要主要的编程体验
  3. Http上传Xml文件
  4. serialVersionUID---java序列化
  5. SOA_环境安装系列1_Oracle SOA Suite11g安装总括(案例)
  6. 随便写写2014创业记(二)
  7. 关于Oracle数据库中行迁移/行链接的问题(一)
  8. SQL server经典电子书、工具和视频教程汇总
  9. Struts1.2+Spring2.5+Hibernate3.2框架搭建(十五)
  10. MyEclipse导入新项目后,不能发布到Tomcat