angular - 有没有办法获取属性的声明类型而不是打字稿中分配值的类型
问题描述
我正在尝试在打字稿中创建一个通用模型类,该模型类可以由子模型扩展,以创建自动 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
。
我的计划是将其用于更复杂的情况,在这些情况下,我们可能有更复杂的对象或具有特殊处理的不同类型,并在父模型类中的集中位置执行所有操作。
我的问题是这样的,我如何知道子模型的属性,获得我们示例的声明类型username
为string
NOT object
?
这是对生成的底层 JavaScript 的限制吗?还是我误解了声明的类属性在 Typescript 中是如何工作的?
我知道在将属性声明为时:
private username: string = '';
它会给我正确的类型,但我不想初始化值,直到它们由 JSON 数据分配,因为在某些情况下null
可能是有效值。
解决方案
您的代码片段假定您在运行时需要打字稿的类型信息。但是,在运行时,所有类型都会被 typescript 编译器擦除。它只发出没有类型注释的纯 javascript。
我相信你最好的选择是创建一个装饰器并用它装饰模型的每个属性 - 就像这样:
class User extends Model {
@ModelField private username: string;
}
还要确保启用emitDecoratorMetadata
编译器选项(https://www.typescriptlang.org/docs/handbook/decorators.html#metadata)
它应该允许您通过反射元数据读取修饰属性的类型(例如,如此答案中所建议的:如何在 TypeScript 装饰器中获取类型数据?)。