Десериализуется в конкретный объект, если он расширен из

#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();