Angular 在typescript中,是否有方法获取属性的声明类型而不是赋值类型
我试图在typescript中创建一个通用模型类,该类可以由子模型扩展,以便在super类中创建一个自动HTTP数据到模型处理方法 基本子模型可能是这样的:Angular 在typescript中,是否有方法获取属性的声明类型而不是赋值类型,angular,typescript,Angular,Typescript,我试图在typescript中创建一个通用模型类,该类可以由子模型扩展,以便在super类中创建一个自动HTTP数据到模型处理方法 基本子模型可能是这样的: export class User extends Model { private username: string = null; constructor () { super (); this.processJson (); } } 我们的父模型类执行以下操作: export
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]);
})
}
}
它将为我提供正确的类型,但在JSON数据分配值之前,我不想初始化这些值,因为在某些情况下,
null
可能是有效值。您的代码片段假定您在运行时需要typescript的类型信息。但是,在运行时,typescript编译器会删除所有类型。它只发出没有类型注释的普通javascript
我相信你最好的选择是创建一个装饰师,并用它来装饰模型的每一个属性-如下所示:
class User extends Model {
@ModelField private username: string;
}
还要确保启用emitDecoratorMetadata
编译器选项()
它应该允许您通过reflect元数据读取修饰属性的类型(例如,如本答案中所建议的:)。您的代码片段假定您在运行时需要typescript的类型信息。但是,在运行时,typescript编译器会删除所有类型。它只发出没有类型注释的普通javascript 我相信你最好的选择是创建一个装饰师,并用它来装饰模型的每一个属性-如下所示:
class User extends Model {
@ModelField private username: string;
}
还要确保启用emitDecoratorMetadata
编译器选项()
它应该允许您通过reflect元数据读取装饰属性的类型(例如,如本答案中所建议的:)。您可以使用
typeof
、===
严格比较和instanceof
您可以使用
typeof
、==
严格比较和instanceof
示例代码:
class Circle {
public kind: string = '';
public radius: number = 0;
}
let objCircle: Circle;
objCircle = {
kind: 'circle1',
radius: 123
} as Circle;
console.log(typeof objCircle.kind === 'string') // true
console.log(typeof objCircle.radius === 'number') // true
console.log(objCircle instanceof Object) // true
示例代码:
class Circle {
public kind: string = '';
public radius: number = 0;
}
let objCircle: Circle;
objCircle = {
kind: 'circle1',
radius: 123
} as Circle;
console.log(typeof objCircle.kind === 'string') // true
console.log(typeof objCircle.radius === 'number') // true
console.log(objCircle instanceof Object) // true
点击
此处输入图像描述
链接查看样本代码代码代码代码图像对任何人都没有帮助;请将您的代码包含在帖子中。单击在此处输入图像描述
链接可查看示例代码代码代码的图像对任何人都没有帮助;请在帖子中包含你的代码。我不相信这能达到我想要的效果,因为它定义了属性的默认值,例如'
或0
而我希望默认值为null
如果默认值为null,则可以使用类型any
,并将其与类圆{public kind:any=null;public radius:number=0;}let objCircle:Circle进行比较;objCircle={kind:null,radius:123}为圆;console.log(typeof objCircle.kind==='object')//truel我不相信这完全达到了我想要的效果,因为它定义了属性的默认值,例如'
或0
而我希望默认值为null
如果默认值为null,则可以使用类型any
,并将其与类圆{public kind:any=null;public radius:number=0;}let objCircle:Circle进行比较;objCircle={kind:null,radius:123}为圆;console.log(typeof objCircle.kind=='object')//true