#javascript
Вопрос:
Я могу создать конкретный экземпляр объекта, возвращенного из вызова json, с помощью HttpClient, но я борюсь с этой частью. Вот полный javascript, который я пытаюсь (использую в RunJS).
Комментарии, добавленные в сериализуемый.От Джейсона(). Я набрал некоторый код для основной идеи, но я не могу понять, как определить экземпляр свойства. Это условие всегда false
есть .
import { of, Observable } from 'rxjs';
const json = '{"id": "82041","name": "Galapagos tortoise","parents": [{"id": "3398","contact": {"firstName": "Dayle","lastName": "Vatini"}}]}'
abstract class Serializable<T> {
protected constructor(object?: Partial<T> | string) {
if (typeof object === 'object') {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
this.fromJson(object as T);
}
}
public fromJson<T>(
json: T | T[] | string): T | T[] {
if (typeof json === 'string') {
json = JSON.parse(json) as T | T[];
}
if (Array.isArray(json)) {
return json.map((i) => this.fromJson(i) as T[]);
}
Object.getOwnPropertyNames(this).forEach((property) => {
// This is where I am stuck. If the item inherits from RestResource | RestResource[], then
// need to fromJson on that property.
if (property instanceof RestResource) {
const { proptery } = json;
json[property] = new property().fromJson(property);
}
});
return Object.assign(this, json);
}
public toJson?(object?: Partial<T> | Partial<T>[]): string {
return JSON.stringify(object || this);
}
}
abstract class RestResource<T, IdType extends number | string = number | string> extends Serializable<T> {
public abstract get id(): IdType;
public constructor(object?: Partial<T>) {
super(object);
}
public hasSameId?(item: RestResource<T>): boolean {
return item amp;amp; item.id === this.id;
}
}
class Ancestry extends RestResource<Ancestry> {
constructor(public id: string, public name: string, public parents: Parent[]) {
super();
}
public get ancestryName() {
return this.name;
}
}
class Parent extends RestResource<Parent> {
public id: string;
public children: Child[];
public contact: Contact;
}
abstract class RestResourceService<T extends RestResource<T, IdType>,
IdType extends number | string = number | string> {
protected constructor(private type: new (object?: T) => T) {
}
public read(): Observable<T | T[]> {
const result = new this.type().fromJson(json as T | T[]);
console.log(result);
return of(result);
}
}
class AncestryService extends RestResourceService<Ancestry> {
constructor() {
super(Ancestry);
}
}
const ancestryService = new AncestryService();
ancestryService.read();