/ / Object.assign oder deklarierte Klasseneigenschaften? - json, eckig, maschinengeschrieben

Object.assign oder deklarierte Klasseneigenschaften? - json, eckig, maschinengeschrieben

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 № 1

Meiner Meinung nach wäre es aus zwei Gründen vorteilhaft, Felder auf öffentlicher Klassenebene zu haben:

  1. Es sollte für Intelligenz sorgen.
  2. 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 pDer 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.