首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Typescript -嵌套对象的返回类型

Typescript -嵌套对象的返回类型
EN

Stack Overflow用户
提问于 2021-06-20 03:23:54
回答 1查看 72关注 0票数 0

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

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

示例

代码语言:javascript
复制
// 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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-20 10:58:01

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

完整示例

代码语言:javascript
复制
// 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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68050063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档