Typescript Standardwerte bei Typumwandlung
Gibt es eine Möglichkeit, ein Objekt auf einen Klassentyp zu typisieren, sodass Standardwerte der Eigenschaften berücksichtigt werden?
Zum Beispiel:
class Person {
name: string = "bob";
age: number;
sex: string;
}
var data = {
"age": 23,
"sex": "male"
}
var p = <Person>data;
console.log(p.name); // -> undefined
Was ist der einfachste Weg, es so zu machen, dass p.name bob ist?
*Bearbeiten
Das scheint zu funktionieren:
var record : Person = Object.assign(new Person(), p);
Ist das gute oder schlechte Praxis?
Antwort #1
Die einfachste Möglichkeit, die Ihnen eine Instanz der Klasse gibt, besteht darin, einen Konstruktor-Initialisierer zu verwenden und die Felder mit Standardwerten optional zu machen:
class Person {
name?: string = "bob";
age: number;
sex: string;
constructor(opt: Person) {
Object.assign(this, opt);
}
}
oder ausdrücklich angeben, was für die Initialisierung optional ist und was nicht.
class Person {
name: string = "bob";
age: number;
sex: string;
constructor(opt: { name?: string, age: number; sex: string; }) {
Object.assign(this, opt);
}
}
oder, wenn es dir egal ist, was angegeben wird, mach einfach alle Initialisierungsfelder optional:
class Person {
name: string = "bob";
age: number;
sex: string;
constructor(opt?: Partial<Person>) {
Object.assign(this, opt);
}
}
Wenn es Ihnen egal ist, ob es sich um eine Instanz der Klasse handelt, Sie aber die Felder und Typen erzwingen möchten, dann vermeiden Sie das Casting und setzen Sie den Typ der Variable stattdessen explizit:
var data = {
"age": 23,
"sex": "male"
}
var p1:Person = {name:"bob", ... data}; // or
var p2:Person = {new Person(), ... data};
Antwort #2
Es gibt keinen Weg, dies mit Typanweisungen (Typumwandlung) zu tun; sie werden zur Kompilierzeit ausgewertet, während Standardwerte zur Laufzeit aufgelöst werden.
Sie sind völlig unterschiedliche Phasen.
