TypeScript – Decorator Metadata
前言
在 TypeScript – Decorator 装饰器 里,我有提到 TypeScript 只实现了 decorate 的特性,把 metadata 的特性独立了出来。
本来我以为还需要等待很长的时间他们才会实现,没想到 v5.2 既然推出了。哎哟,不错哦!
声明: Decorator 不是 TypeScript 语法,它是 ECMAScript (AKA JavaScript) 标准。Metadata 也是,目前是 stage 3。
参考
Docs – Announcing TypeScript 5.2
什么是 Decorator Metadata?
Decorator Metadata 类似于 C# 的 Attribute。就是在 class 属性上写标签(简单说就是记入一些资料)。然后通过反射获取到这些资料并且使用它们。
通常我们用它来实现 Metaprogramming。
搭建环境
和上一篇的 Disposable 做法类似。
必须使用 TypeScript Compiler (AKA tsc),esbuild 还不支持 Decorator。
tsconfig.json 加上 compilerOptions.lib "ESNext.Decorators"
{
"compilerOptions": {
"target": "ES2017",
"lib": [
"ES2017",
"ESNext.Decorators",
"DOM"
],
}
}
再加上 runtime polyfill
(Symbol as { metadata: symbol }).metadata ??= Symbol("Symbol.metadata");
使用方式
定义 decorator function
function setMetadata(_target: unknown, context: ClassMemberDecoratorContext) {
context.metadata[context.name] = true;
}
metadata 这个属性是新的。之前的 Decorator 没有。
apply to class member
class Person {
@setMetadata
firstName = 'Derrick';
}
反射
console.log(JSON.stringify(Person[Symbol.metadata])); // {"firstName":true}
简单明了。
实战场景
TODO future... 等以后有用上了,再补。
TypeScript – Decorator Metadata的更多相关文章
- [TypeScript] Reflection and Decorator Metadata
TypeScript allows you to emit decorator metadata which enables more powerful features through reflec ...
- angular2 学习笔记 (Typescript - Attribute & reflection & decorator)
更新 : 2018-11-27 { date: Date } 之前好像搞错了,这个是可以用 design:type 拿到的 { date: Date | null } 任何类型一但配上了 | 就 de ...
- TypeScript 1.5 Beta带来修饰元数据支持
(此文章同时发表在本人微信公众号"dotNET每日精华文章") 今天由于有点小感冒,就不长篇大论了,简单介绍一下和VS 2015 RC一同发布的TypeScript 1.5 Bet ...
- angular2 学习笔记 (Typescript - Attribute & reflection)
refer : https://www.npmjs.com/package/reflect-metadata refer : https://www.typescriptlang.org/docs/h ...
- ES-Next @Decorator All In One
ES-Next @Decorator All In One @装饰器 import { logged } from "./logged.mjs"; class C { @logge ...
- [Angular 2] Understanding @Injectable
In order to resolve a dependency, Angular’s DI uses type annotations. To make sure these types are p ...
- Angular2经典文章集锦
Angular Metadata 等基础知识 http://www.jianshu.com/p/aeb11061b82c Metadata告诉Angular如何处理一个类,只有我们将它通告给Angul ...
- 聊聊IOC中依赖注入那些事 (Dependency inject)
What is Dependency injection 依赖注入定义为组件之间依赖关系由容器在运行期决定,形象的说即由容器动态的将某个依赖关系注入到组件之中在面向对象编程中,我们经常处理的问题就是解 ...
- Markdown常用语法学习
Markdown常用语法学习,这些就够用了. 演示地址: https://github.com/YalongYan/Markdown-- 特别提示: 标题'##'后面必须加一个空格,否则编译不对.# ...
- [Vue +TS] Use Two-Way Binding in Vue Using @Model Decorator with TypeScript
Vue models, v-model, allow us to use two-way data binding, which is useful in some cases such as for ...
随机推荐
- xampp+vscode 安装PHP断点调试xdebug
官网下载地址:https://xdebug.org/download.php 这里需要特别注意,有TS(thread safe)和NTS 区别,我建议不要下载最新的,我一开始使用最新的发现插件没有匹配 ...
- Django __init__ 方法用于初始化
使用面向对象的方法来创建一个栈板信息的模型,比如使用 Python 的类来表示栈板信息.以下是一个简单的示例: class Pallet: def __init__(self, number, nam ...
- Java 线程池之Jetty 线程池学习总结
Java 线程池之Jetty 线程池学习总结 前提 Jetty 11.0.x 为什么是Jetty? Java提供4中创建线程池的快捷方式 Executors.newFixedThreadPool(); ...
- windows中新建文件菜单消失的解决办法
具体解决办法: https://jingyan.baidu.com/article/cbcede07577f4702f40b4dfd.html 右键中新建文本文件 菜单消失: 注册表编辑器: 路径: ...
- php执行出现权限问题
- fragment的查找和移除
FragmentManager fragmentmanger = getSupportFragmentManager(); FragmentTransaction fragmenttransactio ...
- mysql索引失效的情况七字口诀:“模型数空运最快”
mysql索引失效的情况 七字口诀:"模型数空运最快" 模:使用like进行模糊查询的时候,以百分号%开头的,索引就会失效. 型:代表数据类型,数据类型错误了,索引也会失效. 数: ...
- 【DingTalk】钉钉应用开发
前言部分 最近要开发一个企业内部应用系统 无纸化办公使用钉钉,领导想在钉钉的基础上加入我们自己的应用 引入Activiti工作流引擎开发审批立项等等业务活动,做一个大一统的系统 然后让我负责开发钉钉应 ...
- 【Zookeeper】Re03 集群搭建
我这里采用的是模拟真实情况: 部署三台虚拟机Centos7 192.168.242.101 192.168.242.102 192.168.242.103 每台机器都安装Zookeeper且一致: / ...
- 【Ubuntu】下载安装 20.04.版本 桌面端
下载 Download 这次的是直接在界面上下载的,我都不知道为什么怎么点到之前的版本去了 12.04.5远古版本界面怪难看的... [下载地址:点我访问] https://cn.ubuntu.com ...