Search code examples
typescriptangular6typeof

Get the type of property of object in Angular


I have class in Angular 6

export class classXY{
  xValue: number;
  yValue: number;
  xDate: Date;
  yDate: Date;
  xName?: string;
  yName?: string;
}

in my code, I need to check the properties that have type number.

let obj: ClassXY;
obj.xValue=1;
obj.yValue=null;
obj.xDate= new Date();
obj.yDate= null;
obj.xName= "test";
obj.yName= null;

    for (var key in obj) {
      if ((obj[key] == null) && (typeof obj[key] === "number"))
        obj[key] = -1;
}

typeof obj["yValue"] value is null and typeof "yValue" is string, while I need to return the type of property number. Same for instanceof

How I check the primitive type of property of an object?


Solution

  • TypeScript is compiled down to JavaScript and JavaScript is a dynamically typed language. This means that the type of a variable can change during the runtime as visible here:

    let a = null;
    console.log(typeof a);
    
    a = 5;
    console.log(typeof a);
    
    a = 'hello';
    console.log(typeof a);

    In your case, your condition will never evaluate to true, since if obj[key] is null, then its type can't be number:

    if ((obj[key] == null) && (typeof obj[key] === "number"))
    

    Here is a way to do what you want using property initializers to provide default values to your class fields and a function that compare those fields to the default value assigned when constructing an object of your class:

    function setDefaultValues(obj, defaultValues, valueToCheck) {
      for (const prop in obj) {
        if (defaultValues[prop] === valueToCheck && obj[prop] === null) {
          obj[prop] = valueToCheck;
        }
      }
    }
    
    class A {
      x = -1; // default value
      y = -1; // default value
      z = 'hello';
    }
    
    const a = new A();
    a.y = null; // a.y will be replaced by -1 later
    console.log(a);
    
    setDefaultValues(a, new A(), -1); // check all -1 fields on `new A()`, if null on `a`, then set to -1
    console.log(a);