TypeScript Type или интерфейс для нормализованных данных - PullRequest
0 голосов
/ 17 октября 2018

TLDR: Как создать интерфейс для нормализованных данных?

Я создаю приложение React с использованием TypeScript.Я использую Normalizr для нормализации данных из моих вызовов API.

Чтобы привести пример из документации, ответ API выглядит следующим образом:

Быстрый старт Рассмотрим типичный блогсообщение.Ответ API для одного сообщения может выглядеть примерно так:

{
  "id": "123",
  "author": {
    "id": "1",
    "name": "Paul"
  },
  "title": "My awesome blog post",
  "comments": [
    {
      "id": "324",
      "commenter": {
        "id": "2",
        "name": "Nicole"
      }
    }
  ]
}

Может быть нормализовано к этому:

{
  result: "123",
  entities: {
    "articles": {
      "123": {
        id: "123",
        author: "1",
        title: "My awesome blog post",
        comments: [ "324" ]
      }
    },
    "users": {
      "1": { "id": "1", "name": "Paul" },
      "2": { "id": "2", "name": "Nicole" }
    },
    "comments": {
      "324": { id: "324", "commenter": "2" }
    }
  }
}

Я хотел бы создать интерфейсы для своих функций, которые используют Normalizr.Вот что я пробовал до сих пор:

export interface House {
  uuid: string;
  address: string;
}

export interface Citizen {
  uuid: string;
  name: string;
}

export interface NormalizedData<T> {
  [uuid: string]: T;
}

export interface Entity<T> {
  [name: string]: NormalizedData<T>;
}

export interface NormalizerResult<T> {
  result: any;
  entities: Entity<T>;
}

Так как здесь я должен дать универсальный тип T, этот подход может обрабатывать только одну сущность.Проблема в том, что ключ сущностей может иметь несколько сущностей разных типов, например.Дом и гражданин (и многое другое).Как я могу объяснить это?Собственные типы нормализатора просто возвращают { result: any, entities: any }.

1 Ответ

0 голосов
/ 17 октября 2018

Полагаю, вам нужно что-то вроде этого

export interface NormalizerResult<T extends House | Citizen> {
  result: any;
  entities: Entity<T>;
}

PS. Typescript более полезен, когда вы на 100% знаете структуру ответа, и менее полезен, если ответ каждый раз отличается.Если первое правильно, то вы должны сделать типы для каждого ответа, например

export interface NormalizerResultForHousesAndCitizensRequest {
  result: any;
  entities: {
    houses: NormalizedData<House>,
    citizens: NormalizedData<Citizen>,
  };
}
...