首页 > 解决方案 > 有没有办法获取属性的声明类型而不是打字稿中分配值的类型

问题描述

我正在尝试在打字稿中创建一个通用模型类,该模型类可以由子模型扩展,以创建自动 HTTP 数据以对超类中的处理方法进行建模。

一个基本的子模型可能是这样的:

export class User extends Model {

    private username: string = null;

    constructor () {
        super ();
        this.processJson ();
    }
}

随着我们的父模型类做类似的事情:

export class Model {

    constructor () {
    }

    public processJson<T> () {

        _.forEach (Object.keys (this), (key: string) => {
            console.log (`processing key: ${key}`);
            console.log (typeof this[key]);
        })
   }
}

计划是使用该processJson方法作为单个入口点来获取入站 JSON 数据并根据其定义将其处理到我们的子模型中。

这里的问题是我似乎无法获得在子模型中定义的声明类型,在提供的示例typeof this[key]中将返回object,因为它推断了此示例中分配值的类型null

我的计划是将其用于更复杂的情况,在这些情况下,我们可能有更复杂的对象或具有特殊处理的不同类型,并在父模型类中的集中位置执行所有操作。

我的问题是这样的,我如何知道子模型的属性,获得我们示例的声明类型usernamestringNOT object

这是对生成的底层 JavaScript 的限制吗?还是我误解了声明的类属性在 Typescript 中是如何工作的?

我知道在将属性声明为时:

private username: string = '';

它会给我正确的类型,但我不想初始化值,直到它们由 JSON 数据分配,因为在某些情况下null可能是有效值。

标签: angulartypescript

解决方案


您的代码片段假定您在运行时需要打字稿的类型信息。但是,在运行时,所有类型都会被 typescript 编译器擦除。它只发出没有类型注释的纯 javascript。

我相信你最好的选择是创建一个装饰器并用它装饰模型的每个属性 - 就像这样:

class User extends Model {
  @ModelField private username: string;
}

还要确保启用emitDecoratorMetadata编译器选项(https://www.typescriptlang.org/docs/handbook/decorators.html#metadata

它应该允许您通过反射元数据读取修饰属性的类型(例如,如此答案中所建议的:如何在 TypeScript 装饰器中获取类型数据?)。


推荐阅读