首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用带有map([key,value])和TypeScript的Object.entries

如何正确使用带有map([key,value])和TypeScript的Object.entries
EN

Stack Overflow用户
提问于 2021-10-30 22:53:04
回答 2查看 116关注 0票数 1

我正在学习TypeScript的React,我需要将我的响应数据转换为一个对象。

我写的代码不需要typescript就能工作。你能告诉我怎么做才能保证类型安全吗?

从响应中,我收到以下数据:

代码语言:javascript
复制
 {
        "-MnI78G4UBVNSdurDCQK": {
            "amount": 1,
            "id": 1,
            "image": {
                "url": "https://store.storeimages.cdn-apple.com/4668/as-images.apple.com/is/iphone-13-pro-family-hero?wid=940&hei=1112&fmt=png-alpha&.v=1631220221000"
            },
            "name": "iPhone 13 Pro",
            "price": 5299
        },
      

  "-MnI78IKVgJnmF_8XTZ6": {
        "amount": 2,
        "id": 2,
        "image": {
            "url": "https://cdn.x-kom.pl/i/setup/images/prod/big/product-new-big,,2019/7/pr_2019_7_17_13_43_4_952_00.jpg"
        },
        "name": "Macbook Air M1 16gb 512gb",
        "price": 7999
    }
}

通过使用object.entries,我可以像这样转换数据:

代码语言:javascript
复制
const transformedData = Object.entries(data).map(([key, value]) => {
      return {
        ...value,
        id: key,
      };
    });

它可以工作,但没有类型安全。

EN

回答 2

Stack Overflow用户

发布于 2021-10-30 23:19:16

如果数据来自外部来源,那么您的代码不能确定它的类型。这就是JSON.parse(myJson)返回any类型的原因。

但是,如果您相当确定服务器返回的是什么,您可以编写自己的类型并将数据转换为该类型。

该响应中每个项目的类型如下所示:

代码语言:javascript
复制
interface MyItem {
  amount: number
  id: number
  image: { url: string }
  name: string
  price: number
}

然后api将它们返回到一个带有字符串键的对象中:

代码语言:javascript
复制
type MyApiResponse = { [key: string]: MyItem }

最后,你只需要告诉typescript,作为程序员,你知道这个数据的类型是什么:

代码语言:javascript
复制
const transformedData = Object.entries(data as MyApiResponse).map(([key, value]) => {
  return {
    ...value,
    id: key,
  };
});

const test = transformedData[0].image.url // string

Playground

票数 0
EN

Stack Overflow用户

发布于 2021-10-30 23:19:22

代码语言:javascript
复制
interface Data {
    amount: number,
    id: number,
    image: {
        url: string
    },
    name: string,
    price: number
}

interface DataMap {
    [key:string]: Data
}

const data:DataMap =  {
        "-MnI78G4UBVNSdurDCQK": {
            "amount": 1,
            "id": 1,
            "image": {
                "url": "https://store.storeimages.cdn-apple.com/4668/as-images.apple.com/is/iphone-13-pro-family-hero?wid=940&hei=1112&fmt=png-alpha&.v=1631220221000"
            },
            "name": "iPhone 13 Pro",
            "price": 5299
        },
      

  "-MnI78IKVgJnmF_8XTZ6": {
        "amount": 2,
        "id": 2,
        "image": {
            "url": "https://cdn.x-kom.pl/i/setup/images/prod/big/product-new-big,,2019/7/pr_2019_7_17_13_43_4_952_00.jpg"
        },
        "name": "Macbook Air M1 16gb 512gb",
        "price": 7999
    }
}

您可以使用给定的接口来描述数据结构。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69782730

复制
相关文章

相似问题

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