私は複合型(複数型クラス)のjson応答オブジェクト(nodejs/mongooseバックエンドから受け取る)をtypescriptクラスにキャストしようとしています。角型5/Typescript - 複雑なjsonオブジェクトをクラスにキャストする方法
モーメントクラスには、タイプuserの著者とタイプcommentのコメント配列が含まれています。
moment.model.ts
import { Comment } from './comment.model';
import { User } from './user.model';
export class Moment {
_id?: string = null;
body?: string = null;
_author?: User = null;
likes?: any[] = [];
dislikes?: any[] = [];
_comments?: Comment[] = [];
created_at?: string = null;
updated_at?: string = null;
constructor(data?: Moment) {
console.log(data);
if (data) {
this.deserialize(data);
}
}
private deserialize(data: Moment) {
const keys = Object.keys(this);
for (const key of keys) {
if (data.hasOwnProperty(key)) {
this[key] = data[key];
}
}
}
public get author(): User {
return this._author;
}
public set author(data: User) {
this._author = new User(data);
}
public get comments(): Comment[] {
return this._comments;
}
public set comments(data: Comment[]) {
this._comments = data.map(c => new Comment(c));
}
}
comment.model.ts
export class Comment {
_id?: string = null;
body?: string = null;
moment?: any = null;
author?: any = null;
likes?: any[] = [];
dislikes?: any[] = [];
parent?: any = null;
replies?: any = null;
updated_at?: string = null;
created_at?: string = null;
constructor(data?: Comment) {
console.log(data);
if (data) {
this.deserialize(data);
}
}
private deserialize(data: Comment) {
const keys = Object.keys(this);
for (const key of keys) {
if (data.hasOwnProperty(key)) {
this[key] = data[key];
}
}
}
}
user.model.ts
export class User {
_id?: string = null
updated_at?: string = null;
created_at?: string = null;
profile?: any = null;
phone?: any = null;
email?: any = null;
followers: any[] = [];
following: any[] = [];
isOnline: any = null;
socketId: any = null;
constructor(data?: User) {
console.log(data);
if (data) {
this.deserialize(data);
}
}
private deserialize(data: User) {
const keys = Object.keys(this);
for (const key of keys) {
if (data.hasOwnProperty(key)) {
this[key] = data[key];
}
}
}
moment.service.ts
get(moment_id) {
let endpoint = this.path + moment_id;
return this.apiService.get(endpoint)
.map((res) => new Moment(res.data));
}
瞬間-detail.component.ts
this.route.params.switchMap((params) => {
let moment_id = params['id'];
return this.momentService.get(moment_id);
}).subscribe((res) => {
this.moment = res;
console.log(this.moment);
});
私は私は一瞬の新しいクラスにJSONを割り当てる私のサービスを呼び出す。コンポーネントでは、この部分を印刷してみます。著者と空白のコメントを除いて、すべてが問題ありません。
'_author'は' User'型で、 'new User(data [key])'のように呼び出す場合にのみ_authorのメンバーに値が割り当てられます。それ以外の場合は、型の互換性のため、エラーが発生し、期待されるnullが返されます。 –
あなたが瞬間の例を持ってきたら、もっと簡単にテストすることができます。あなたは思いませんか?また、私はあなたがjavascriptのラベルを消去する必要があると思うので、このコードではJavaScriptコードがありません(バックエンドとしてnode.jsを使用している場合でも)。好奇心のように、なぜコピーコンストラクタを使用するのですか(コンストラクタの内部を逆シリアル化します)?それは実際に必要ですか? – JTejedor
@SantoshHegdeあなたは私がその問題を理解していると思っています、そこへの解決策はありますか? – KHAN