Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 在typescript中,是否有方法获取属性的声明类型而不是赋值类型_Angular_Typescript - Fatal编程技术网

Angular 在typescript中,是否有方法获取属性的声明类型而不是赋值类型

Angular 在typescript中,是否有方法获取属性的声明类型而不是赋值类型,angular,typescript,Angular,Typescript,我试图在typescript中创建一个通用模型类,该类可以由子模型扩展,以便在super类中创建一个自动HTTP数据到模型处理方法 基本子模型可能是这样的: export class User extends Model { private username: string = null; constructor () { super (); this.processJson (); } } 我们的父模型类执行以下操作: export

我试图在typescript中创建一个通用模型类,该类可以由子模型扩展,以便在super类中创建一个自动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]);
        })
   }
}

它将为我提供正确的类型,但在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