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

Joh*_*isz 9 arrays reflection decorator typescript

我在TypeScript中有以下小类,其中一些公共字段被装饰:

class Company {
    @dataMember
    public name: string;

    @dataMember
    public people: Person[];
}

class Person {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

我的属性装饰函数:

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

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


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

aaa*_*aaa 7

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

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

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

@dataMember(String)
myProp: Array<String>
Run Code Online (Sandbox Code Playgroud)

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

@dataMember("People")
people: People[]
Run Code Online (Sandbox Code Playgroud)