0.1.0 • Published 1 month ago

@nailyjs/metadata v0.1.0

Weekly downloads
-
License
MIT
Repository
github
Last release
1 month ago

TC39 Stage 3 提案 TypeScript 装饰器 metadata

English

介绍

众所周知,TypeScript 5.x目前还没有实现装饰器的元数据,这使得我们无法在运行时获取装饰器的元数据。这个仓库使用babel插件的方式,实现了装饰器的元数据。

其实原理很简单,整个项目只有一个文件,就是src/index.ts,它的作用就是修改Reflect.metadata

Reflect.metadata是旧版本的装饰器元数据的实现,有一个Babel仓库babel-plugin-transform-typescript-metadata,它的作用是将TypeScript的装饰器元数据转换为Reflect.metadata

而这个仓库的作用是将Reflect.metadata转换为新版本的装饰器元数据,这样就可以在运行时获取装饰器元数据了。

源码很简单,只有一个文件,但是实现了这个很重要的功能,有所帮助。

使用

npm install @nailyjs/metadata
// 首先在最顶上引入@nailyjs/metadata
import "@nailyjs/metadata";

// 定义一个Stage 3装饰器
function log() {
  return (target: Function, ctx: DecoratorContext) => {};
}

@log()
class TestService {
  constructor(readonly i: number) {}

  @log()
  test() {}
}

console.log(TestService[Symbol.metadata]);

上面的代码会输出为:

[Object: null prototype] {
  'design:method': {
    test: { 'design:paramtypes': [], 'design:type': [Function: Function] }
  },
  'design:class': {
    'design:paramtypes': [ [Function: Number] ],
    'design:type': [Function: Function]
  }
}

见本仓库的test目录的例子。

0.1.0

1 month ago