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

14

我有一个 TypeScript 中的小类,其中一些公共字段被修饰:

class Company {
    @dataMember
    public name: string;

    @dataMember
    public people: Person[];
}

class Person {
    // ...
}

通过使用反射元数据,我可以确定公司属性名称人员的类型:它们分别是构造函数StringArray,这是可以预期和合理的。

我的属性装饰器函数:

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

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


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

1个回答

10

我认为目前这是不可能的。如果您查看生成的js文件,对于任何数组,它都会创建类型为Array且没有关于类型的任何信息的元数据。

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

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

@dataMember(String)
myProp: Array<String>

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接