You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:19:59