我正在 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
接口,这就是它抛出错误的原因。我感到困惑的是如何真正让它按预期工作。我会很感激你们的任何建议。