如何用TypeScript声明限定特定键的接口或类型?
如何为货币对数据函数声明严格的TypeScript接口?
需要为返回特定货币对(BTC/USD、BTC/ETH、ETH/USD等)数据的函数声明TypeScript接口,要求:
- 外层键只能是
"bitcoin"或"ethereum" - 内层键需对应匹配的货币字段及24小时变化字段,比如BTC/USD对应
usd和usd_24hr_change,BTC/ETH对应eth和eth_24hr_change
数据示例
BTC/USD
{ "bitcoin": { "usd": 12345, "usd_24hr_change": -1.2345 } }
BTC/ETH
{ "bitcoin": { "eth": 12345, "eth_24hr_change": -1.2345 } }
ETH/USD
{ "ethereum": { "usd": 12345, "usd_24hr_change": -1.2345 } }
尝试过的宽泛接口(不符合需求)
interface CurrencyData { [id: string]: { [id: string]: number; }; }
解决方案:严格限定类型的联合接口
通过联合类型结合具体子类型,可以精准限定所有允许的结构:
// 定义允许的加密货币类型 type CryptoCurrency = 'bitcoin' | 'ethereum'; // 定义Bitcoin对应的两种数据结构(BTC/USD、BTC/ETH) type BitcoinData = | { usd: number; usd_24hr_change: number } | { eth: number; eth_24hr_change: number }; // 定义Ethereum对应的唯一数据结构(ETH/USD) type EthereumData = { usd: number; usd_24hr_change: number }; // 最终的严格类型,覆盖所有合法货币对结构 type CurrencyData = | { bitcoin: BitcoinData } | { ethereum: EthereumData };
验证示例
// 合法的BTC/USD数据 const btcUsd: CurrencyData = { bitcoin: { usd: 12345, usd_24hr_change: -1.2345 } }; // 合法的BTC/ETH数据 const btcEth: CurrencyData = { bitcoin: { eth: 12345, eth_24hr_change: -1.2345 } }; // 合法的ETH/USD数据 const ethUsd: CurrencyData = { ethereum: { usd: 12345, usd_24hr_change: -1.2345 } }; // ❌ 类型错误:bitcoin包含多余字段 const invalid1: CurrencyData = { bitcoin: { usd: 12345, usd_24hr_change: -1.2345, eth: 678 } }; // ❌ 类型错误:外层键不在允许范围内 const invalid2: CurrencyData = { litecoin: { usd: 123 } };
这种方式能在编译阶段就拦截不符合要求的数据结构,完全满足严格限定需求。
内容的提问来源于stack exchange,提问作者Tajammul
相关产品推荐
相关产品推荐

