Создание интерфейса Angular / Typescript для анализа возвращаемых значений JSON Alpha Vantage API - PullRequest
0 голосов
/ 28 сентября 2019

Я создаю проект на 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 интерфейс, и поэтому выдает ошибку.Что меня смущает, так это то, как заставить это работать так, как задумано.Буду признателен за любые советы, которые вы, ребята, получите.

...