0

我正在 Angular 中创建一个项目,该项目使用 Alpha Vantage API 来查找股票价格并在图表中显示历史股票数据,但是我无法创建一个接口来存储我从 API 调用返回的 JSON 字符串. 我知道我可以只调用JSON.parse(),但是由于最好将 Angular 的返回值HttpClient转换为模板以便于访问(而不是手动解析从 中返回的对象JSON.parse(),我想弄清楚这一点。

所以问题是从 API 调用(具体来说是任何 TIME_SERIES_X 调用)返回的 JSON 字符串对于 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'.

除非我弄错了,因为 ["Meta Data"] 是一个用作索引签名的字符串,Angular/Typescript 试图将其转换为SeriesFormat接口,这就是它抛出错误的原因。我感到困惑的是如何真正让它按预期工作。我会很感激你们的任何建议。

4

0 回答 0