Ich erstelle eine eckige Anwendung, die auf das Internet zugreift Zucken API. Die Daten werden in verschiedenen Ausgaben zurückgegeben, von denen einige ich möchte deserialisieren und in ein paar Klassen speichern.
Was ich wissen möchte, ist, was die Risiken des Gebrauchs sind Object.assign
Instanziieren einer Klasse im Vergleich zum manuellen Zuweisen von Eigenschaften aus deserialisiert JSON-Daten?
Was ich momentan habe:
export class UserDetails implements Serializable<UserDetails>{
public _id: number;
public bio: string;
public created_at: string;
public display_name: string;
public email: string;
public email_verified: boolean;
public logo: string;
public name: string;
public notifications: Object;
public partnered: boolean;
public twitter_connected: boolean;
public type: string;
public updated_at: string;
constructor() {}
deserialize(input: any) {
this._id = input._id;
this.bio = input.bio;
this.created_at = input.created_at;
this.display_name = input.display_name;
this.email = input.email;
this.email_verified = input.email_verified;
this.logo = input.logo;
this.name = input.name;
this.notifications = input.notifications;
this.partnered = input.partnered;
this.twitter_connected = input.twitter_connected;
this.type = input.type;
this.updated_at = input.updated_at;
return this;
}
}
Was ich gebrauchen könnte Object.assign
.
export class UserDetails implements Serializable<UserDetails>{
constructor() {}
deserialize(input: any) {
Object.assign(this, input);
return this;
}
}
Ich bin dabei, eine neue Klasse mit fast 70 Eigenschaften zu erstellen. Ist dies der beste Ansatz?
Nachgedacht... ODER soll ich eigentlich die 2 mischen, damit ich noch Intellisense bekomme?
export class UserDetails implements Serializable<UserDetails>{
public _id: number;
public bio: string;
public created_at: string;
public display_name: string;
public email: string;
public email_verified: boolean;
public logo: string;
public name: string;
public notifications: Object;
public partnered: boolean;
public twitter_connected: boolean;
public type: string;
public updated_at: string;
constructor() {}
deserialize(input: any) {
Object.assign(this, input);
return this;
}
}
Antworten:
0 für die Antwort № 1Meiner Meinung nach wäre es aus zwei Gründen vorteilhaft, Felder auf öffentlicher Klassenebene zu haben:
- Es sollte für Intelligenz sorgen.
- Die Verwendung eines nicht deklarierten Feldes sollte einen Fehler auslösen (dies gilt auch, wenn kein Feld deklariert ist). Beachten Sie, dass mit
Object.assign
kann dem Objekt nicht deklarierte Felder hinzufügen.
Beispiel (Geigenverbindung):
class Person {
firstName;
lastName;
deserialize(input: any) {
Object.assign(this, input);
return this;
}
}
let p = new Person();
p.deserialize({firstName:"John", lastName:"Doe", sex:"M"});
console.log(p); //<-- logs: Person { firstName: "John", lastName: "Doe", sex: "M" }
console.log(p.sex); //<-- this logs "M" to console in JSFiddle.
Beachten Sie, dass das Eigentum sex
wird hinzugefügt p
Der direkte Zugriff auf die Eigenschaft erfolgt jedoch wie im zweiten Schritt console.log
sollte den folgenden Kompilierungsfehler auslösen (obwohl er auf JSFiddle funktioniert, nicht genau sicher warum):
TSError: ⨯ TypeScript kann nicht kompiliert werden
nodesrctest.ts (13,15): Die Eigenschaft "sex" ist für den Typ "Person" nicht vorhanden. (2339) ...
Wenn Sie sich also für diese Art von Sicherheit entscheiden möchten, kann es hilfreich sein, die Felder zu deklarieren.
Hoffe das hilft.