Typescript不发出装饰器元数据

时间:2018-07-24 08:24:14

标签: typescript reflect-metadata

我有一个打字稿项目,想检查一些对象。因此,我安装了reflect-metadata,并在experimentalDeorators中启用了emitDecoratorMetadatatsconfig.json。然后我有这段代码:

import 'reflect-metadata';
class Bla {
    thing: string;
}
console.log(Bla, Reflect.getMetadata('design:type', Bla, 'thing'));

它输出undefined。我希望得到String或其他东西。另外,编译后的Javascript如下所示:

var Bla = /** @class */ (function () {
    function Bla() {
    }
    return Bla;
}());
console.log(Bla, Reflect.getMetadata('design:type', Bla, 'thing'));

没有用于设置元数据的代码。有趣的是,在添加自定义装饰器的那一刻,我看到为设置元数据而发出的代码:

function deco(target, key) { }
var Bla = /** @class */ (function () {
    function Bla() {
    }
    __decorate([
        deco,
        __metadata("design:type", String)
    ], Bla.prototype, "thing", void 0);
    return Bla;
}());
console.log(Bla, Reflect.getMetadata('design:type', Bla, 'thing'));

但我仍然得到undefined。我也尝试过Bla.prototype,没有变化。知道这里怎么了吗?

1 个答案:

答案 0 :(得分:1)

这是设计使然,装饰器元数据仅在经过装饰的成员上发出。这是它引用的PRissue,标题和第一行都说明了这一点:

  

装饰器

发出序列化的设计时类型元数据      

在实验性编译器选项后面添加支持,以为源中的装饰声明发出设计类型的元数据。

(添加了强调)

添加装饰器时的问题是您需要检查prototype

import 'reflect-metadata';
function deco(target, key) { }
class Bla {
    @deco thing: string;
}
console.log(Reflect.getMetadata('design:type', Bla.prototype, 'thing')); // outputs String