如何使用Reflection API在TypeScript中获取数组项类型?

时间:2016-01-26 19:53:29

标签: arrays reflection typescript decorator

我在TypeScript中有以下小类,其中包含一些公共字段:

class Company {
    @dataMember
    public name: string;

    @dataMember
    public people: Person[];
}

class Person {
    // ...
}

通过使用reflect metadata,我可以确定公司属性名称的类型:它们是构造函数 String 数组,分别是预期和逻辑的。

我的属性装饰函数:

function decorate(target: Object, propertyKey: string | symbol): void {
    var reflectType = Reflect.getMetadata("design:type", target, propertyKey);
    // ...
}

但是我如何确定数组元素的类型(构造函数)?它甚至可能吗?在上面的例子中,它应该是(引用) Person

注意:在实例化之前我需要类型引用,因此,使用数组项动态确定类型是不可能的:没有数组项,甚至没有数组实例。

1 个答案:

答案 0 :(得分:6)

我认为现在不可能。如果您看到生成的js文件,对于任何内容的数组,它会创建类型为Array的元数据,而不包含任何类型的信息。

__decorate([
    dataMember_1.dataMember, 
    __metadata('design:type', Array)
], Company.prototype, "people", void 0);

对于内置类型,我能想到解决这个问题的一种方法是在装饰器本身传递类型并在装饰器代码中编写自定义逻辑。

@dataMember(String)
myProp: Array<String>

对于Custom对象,大多数情况下,当触发装饰器调用时,模块未完全加载。因此,一种方法是传递类名并稍后解析它。

@dataMember("People")
people: People[]