typescript - Hämta typen av egenskap hos objekt i Angular
Jag har klass i Angular 6
export class classXY{
xValue: number;
yValue: number;
xDate: Date;
yDate: Date;
xName?: string;
yName?: string;
}
I min kod behöver jag kontrollera de egenskaper som har typen nummer.
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"]-värdet är null och typeof "yValue" är string, medan jag behöver returnera typen av egenskapen number. Samma gäller för instanceof
Hur kontrollerar jag den primitiva typen av en egenskap hos ett objekt?
Svar #1
TypeScript kompileras ner till JavaScript och JavaScript är ett dynamiskt typat språk. Detta innebär att typen av en variabel kan ändras under körningstiden som syns här:
let a = null;
console.log(typeof a);
a = 5;
console.log(typeof a);
a = 'hello';
console.log(typeof a);I ditt fall kommer ditt villkor aldrig att utvärderas till sant, eftersom om obj[key] är null, då kan dess typ inte vara number:
if ((obj[key] == null) && (typeof obj[key] === "number"))
Här är ett sätt att göra det du vill genom att använda egenskapsinitierare för att tilldela standardvärden till dina klassfält och en funktion som jämför dessa fält med standardvärdet som tilldelats när ett objekt av din klass konstrueras:
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);