Я создаю проект на Angular, который использует Alpha Vantage API для поиска цен на акции и отображения исторических данных о запасах в виде графика, но у меня возникают проблемы при создании интерфейса для хранения строки JSON, из которой я получаю обратновызов API.Мне известно, что я мог бы просто вызвать JSON.parse()
, но так как это лучший способ - преобразовывать результаты из HttpClient
Angular в шаблон для легкого доступа (вместо ручного анализа объекта, возвращенного из JSON.parse()
, я бы хотелчтобы понять это.
Итак, проблема в том, что строка JSON, возвращаемая из вызова API (если быть точнее, любого из вызовов TIME_SERIES_X), имеет имена свойств переменных практически для всего, что находится после MetaData.ниже:
{
"Meta Data": {
"1. Information": "Intraday (5min) open, high, low, close prices and volume",
"2. Symbol": "AAPL",
"3. Last Refreshed": "2019-09-27 16:00:00",
"4. Interval": "5min",
"5. Output Size": "Compact",
"6. Time Zone": "US/Eastern"
},
"Time Series (5min)": {
"2019-09-27 16:00:00": {
"1. open": "218.6500",
"2. high": "218.9300",
"3. low": "218.3700",
"4. close": "218.8500",
"5. volume": "630543"
},
"2019-09-27 15:55:00": {
"1. open": "218.8100",
"2. high": "218.9200",
"3. low": "218.6200",
"4. close": "218.6600",
"5. volume": "545536"
},
"2019-09-27 15:50:00": {
"1. open": "218.7100",
"2. high": "218.8400",
"3. low": "218.5800",
"4. close": "218.8200",
"5. volume": "260471"
}
}
}
И "Time Series (5min)"
, и все временные метки различаются в зависимости от времени вызова API и параметров, которые вы ему задаете (подробнее об Alpha Vantage API здесь ).
Итак, вот что у меня есть. Поскольку функция TIME_SERIES_INTRADAY
имеет структуру метаданных, отличную от других, я выделил ее и использовал тип объединения для раздела метаданных интерфейса TimeSeriesResponseFormat
..
interface SeriesFormat {
[entryTitle: string]: {
["1. open"]: string,
["2. high"]: string,
["3. low"]: string,
["4. close"]: string,
["5. volume"]: string
}[]
}
interface IntradayMetadataFormat {
["1. Information"]: string,
["2. Symbol"]: string,
["3. Last Refreshed"]: string,
["4. Interval"]: string,
["5. Output Size"]: string,
["6. Time Zone"]: string
}
interface MetadataFormat {
["1. Information"]: string,
["2. Symbol"]: string,
["3. Last Refreshed"]: string,
["4. Output Size"]: string,
["5. Time Zone"]: string
}
export interface TimeSeriesResponseFormat {
["Meta Data"]: MetadataFormat | IntradayMetadataFormat,
[seriesTitle: string]: SeriesFormat
}
Я получаю ошибку:
Property '["Meta Data"]' of type 'IntradayMetadataFormat | MetadataFormat' is not assignable to string index type 'SeriesFormat'.
Если я не ошибаюсь, поскольку ["Метаданные"] - это строка, используемая в качестве индекса signature, Angular / Typescript пытается преобразовать его в SeriesFormat
интерфейс, и поэтому выдает ошибку.Что меня смущает, так это то, как заставить это работать так, как задумано.Буду признателен за любые советы, которые вы, ребята, получите.