Typescript - 嵌套对象的返回类型

时间:2021-06-19 19:23:54

标签: typescript

我有一个包含一堆对象的对象。每个嵌套对象都包含键值对,其中值是一个 URL。然后我有一个函数,它以嵌套对象之一的名称作为输入并循环该对象中的所有条目,从 URL 获取数据并返回一个具有相同键的对象,但 URL 字符串被替换为从 URL 返回的数据。

我正在寻找一种方法来动态更改返回类型,以便键与正在迭代并返回的嵌套对象的类型相匹配。

示例

// URL Object
const URLS = {
  Baseball: {
    Dodgers: 'url-a1',
    Angels: 'url-a2',
    Padres: 'url-a3',
  },
  Football: {
    Chargers: 'url-b1',
    Rams: 'url-b2',
  },
}

// Function making HTTP calls
function getUrlData(sport: string): Record<???, any> {
  const values = {}
  Object.entries(URLS[sport]).forEach(([team, url]) => {
    values[team] = httpGet(url)
  })
  return values
}

getUrlData('Baseball') // Return type: Record<keyof typeof URLS.Baseball, any>
getUrlData('Football') // Return type: Record<keyof typeof URLS.Football, any>

// I'm looking for some way to do something like
Record<keyof typeof URLS[sport], any>

1 个答案:

答案 0 :(得分:1)

Record<keyof typeof URLS[sport], any> 中,您正在根据传入的 URLS 查找 sport 中的键。您可以使用泛型 sport 来捕获 T 的类型,然后执行 URLS[T]。当然,为了做到这一点,您需要将 T 限制为只是 URLS (T extends keyof typeof URLS) 中的键。

完整示例

// URL Object
const URLS = {
  Baseball: {
    Dodgers: 'url-a1',
    Angels: 'url-a2',
    Padres: 'url-a3',
  },
  Football: {
    Chargers: 'url-b1',
    Rams: 'url-b2',
  },
}

// Function making HTTP calls
function getUrlData<T extends keyof typeof URLS>(sport: T): Record<keyof typeof URLS[T], any> {
  const values:any = {};
  Object.entries(URLS[sport]).forEach(([team, url]) => {
    values[team] = httpGet(url)
  })
  return values;
}

getUrlData('Baseball') // Return type: Record<keyof typeof URLS.Baseball, any>
getUrlData('Football') // Return type: Record<keyof typeof URLS.Football, any>