TS 元数据

TS 元数据

在使用元数据前,首先需要在 tsconfig.json 中启用。

{
  "compilerOptions": {
    // 支持装饰器
    "experimentalDecorators": true,
    // 装饰器元数据
    "emitDecoratorMetadata": true
  }
}

接着需要安装 reflect-metadata 库。

在入口文件引入。

// main.ts
import 'reflect-metadata'

// ...

获取元数据

TS 为使用了装饰器的代码注入了三组元数据。

  • design:paramtypes 获取函数参数类型。
  • design:returntype 获取函数返回类型。
  • design:type 获取类型。
const Injectable: ClassDecorator = target => {}

const Shared: PropertyDecorator = target => {}

const NotShared: MethodDecorator = target => {}

const Parse: ParameterDecorator = target => {}

@Injectable
class Example {

  @Shared
  name: string = ''

  @NotShared
  method (@Parse p: number): boolean {
    return false
  }
}


Reflect.getMetadata('design:paramtypes', Example.prototype, 'method')
// [ [Function: Number] ]

Reflect.getMetadata('design:type', Example.prototype, 'method')
// [Function: Function]

Reflect.getMetadata('design:returntype', Example.prototype, 'method')
// [Function: Boolean]

Reflect.getMetadata('design:paramtypes', Example.prototype, 'name')
// undefined

Reflect.getMetadata('design:returntype', Example.prototype, 'name')
// undefined

Reflect.getMetadata('design:type', Example.prototype, 'name')
// [Function: String]

设置元数据

Reflect.defineMetadata('public', true, Example)
Reflect.getMetadata('public', Example) // true

TS 元数据
http://localhost:8080/archives/f72474f6-2b1a-4c23-891b-bbe983a9bef3
作者
inksha
发布于
2024年09月14日
许可协议