Получить тип свойства объекта в Angular - PullRequest
0 голосов
/ 01 мая 2019

У меня есть класс по Angular 6

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

в моем коде мне нужно проверить свойства, которые имеют номер типа.

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"] значение равно нулю, а typeof "yValue" - строка, в то время как мне нужно вернуть тип номера свойства. То же самое для instanceof

Как проверить примитивный тип свойства объекта?

1 Ответ

1 голос
/ 01 мая 2019

TypeScript скомпилирован в JavaScript, а JavaScript является динамически типизированным языком.Это означает, что тип переменной может измениться во время выполнения, как показано здесь:

let a = null;
console.log(typeof a);

a = 5;
console.log(typeof a);

a = 'hello';
console.log(typeof a);

В вашем случае ваше состояние никогда не будет оценено как истинное, поскольку если obj[key] равно null, то его тип не может быть number:

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

Вот способ сделать то, что вы хотите, используя инициализаторы свойств для предоставления значений по умолчанию для полей вашего класса и функцию, которая сравнивает эти поля со значением по умолчанию, назначенным при создании объекта вашего класса:

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);
...