Как мне написать интерфейс для вложенного объекта, если я не уверен, какие ключи будут вызываться? - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь написать интерфейс для данных ответа о ценах на акции.

Например, при запросе цен на акции в конкретном диапазоне дат для Google я получаю следующее:

{
  "daily_prices": {
    "2019-05-10": {
      "open": 1168.84,
      "high": 1176.28,
      "low": 1146.37,
      "close": 1167.64
    },
    "2019-05-13": {
      "open": 1145.24,
      "high": 1151.97,
      "low": 1125.5,
      "close": 1136.59
    },
    "2019-05-14": {
      "open": 1142.32,
      "high": 1144.87,
      "low": 1123.53,
      "close": 1124.86
    },
    "2019-05-15": {
      "open": 1122.55,
      "high": 1178.3,
      "low": 1121.4,
      "close": 1170.8
    }
  }
}

Я бы хотел написать для этого интерфейс, но я не знаю, сколько объектов будет существовать внутри daily_prices объектов. И я не знаю, что будет с property.

Я хочу сделать что-то вроде этого:

interface stockPrices {
  daily_prices: {
    SOME_KIND_OF_DATE: {
      open: number,
      high: number,
      low: number,
      close: number
    }
  }
}

Но я не знаю, сколько объектов будет в пределах daily_prices либо.

Есть идеи?

1 Ответ

1 голос
/ 07 мая 2020

Для этого можно использовать индексируемый тип , то есть { [key: string]: ... }:

interface StockPrices {
  daily_prices: {
    [key: string]: {
      open: number,
      high: number,
      low: number,
      close: number
  } }
}

См. Пример TypeScript Playground .


Рассмотрите возможность абстрагирования вложенного интерфейса

Если вы хотите улучшить читаемость, вы можете даже абстрагироваться от вложенного интерфейса:

interface StockPrice {
  open: number,
  high: number,
  low: number,
  close: number
}

interface StockPrices {
  daily_prices: { [key: string]: StockPrice }
}

См. Пример на Площадка для игр TypeScript .


Используйте Record<T, K> или общий c вспомогательный тип

Еще лучше, вы можете воспользоваться преимуществом Record<> типа (см. игровая площадка ):

interface StockPrice {
  open: number,
  high: number,
  low: number,
  close: number
}

interface StockPrices {
  daily_prices: Record<string, StockPrice>
}

... или объявите для этого общий c Dictionary интерфейс (см. игровая площадка :

// For bigger projects, this can be stashed away as a generic util/helper type
type Dictionary<T> = { [key: string]: T };

interface StockPrice {
  open: number,
  high: number,
  low: number,
  close: number
}

interface StockPrices {
  daily_prices: Dictionary<StockPrice>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...