为什么反射元数据仅在使用装饰器时有效?

neh*_*ist 1 typescript reflect-metadata

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

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

返回[Function: Bar],这很好。但是如果没有@Baz装饰器(实际上不执行任何操作),它将返回undefined。为什么?

Tit*_*mir 5

实现此功能的PR指出:

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

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

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