为什么reflect-metadata仅在使用装饰器时有效?

时间:2018-01-31 16:32:17

标签: typescript reflect-metadata

没有装饰器,元数据会丢失 - 但为什么呢?

const Baz = () : ClassDecorator => {
  return target => {}
}
class Bar {}
@Baz()
class Foo {
  constructor(bar: Bar) {}
}
console.log(Reflect.getMetadata('design:paramtypes', Foo));

这会返回[Function: Bar],这很好。但如果没有@Baz装饰器(几乎没有任何东西),它将返回undefined。为什么呢?

1 个答案:

答案 0 :(得分:1)

实现此功能的PR说明:

  

在源代码中为修饰声明发出设计时类型元数据。

因此它明确被设计为只在类上有装饰器时发出元数据。

我无法找到这个决定背后的理由,但我猜它为所有类发出这个代码会很浪费(js对大小敏感),装饰器和元数据被视为相关概念。