javascript - 访问对象映射中不同类型的值

标签 javascript reactjs json typescript javascript-objects

我有一些数据,如下所示 -

    {
      System: 'VIT0056',
      Value: {
        Start: 3.3,
        End: 3.9
      },
      'Initial Range' : {
        'Start': '1/12/2022',
        'End': '31/12/2022',
      },
      Manager: 'Karl Woods',
      Location: 'Tokyo',
      Price: '$1.50',
    },

我目前正在像这样映射这个对象 -


 {Object.entries(data).map(([key, val]) => {
              if (key === 'Value') {
                return (
                  <S.ValueContainer key={key}>
                    <Label>{key}:</Label>
                    <Text size="small">** DO SOMETHING HERE TO SHOW VALUES **</Text>
                  </S.ValueContainer>
                )
              }

              if (key === 'Initial Range') {
                return (
                  <S.ValueContainer key={key}>
                    <Label>{key}:</Label>
                    <Text size="small">** DO SOMETHING HERE TO SHOW VALUES ** </Text>
                  </S.ValueContainer>
                )
              }

              return (
                <S.ValueContainer key={key}>
                  <Label>{key}:</Label>
                  <Text size="small">{val}</Text>
                </S.ValueContainer>
              )
            }
         )
      }

对于值和初始范围键,我希望能够像这样显示它们 -

值:3.3 - 3.9

初始范围:2022年12月1日至2022年12月31日

但是,由于这些值是嵌套对象,我在访问这些值时遇到了困难。

当我将它们放入 if 语句并尝试执行 val.Start 时,它告诉我 -

类型“string |”上不存在属性“Start”范围'。

但我知道我将在此 block 中访问的值只能是 Range 类型。有没有办法定义这个?

最佳答案

您可以使用 type assertion告诉你的编译器,该值实际上是一个 Range

<Text size="small">{(val as Range).Start} - {(val as Range).End}</Text>

或者您可以实现 ToString(value: string | Range) 函数

function ToString(value: string | Range) {
  //if value is a string, just return the value
  if (typeof value === "string") return value;

  //here the compiler knows it must be a Range
  //because it's not a string ...
  return `${value.Start} - ${value.End}`;
}

并在渲染中使用它

<Text size="small">{ToString(val)}</Text>

此外,您似乎也有不同类型的范围。因此,在使用 ToString() 方法时,您可能还需要对开始和结束属性进行类型检查

function ToString(value: string | Range) {
  if (typeof value === "string") return value;

  if (typeof value.Start === "number")
    return `${value.Start} - ${value.End}`;

 //here you know value is a range and
 //the properties of range are strings
 //(given both always have the same type

  //or apply appropriate formatting for your dates
  return `${value.Start} to ${value.End}`;

}

当然你也可以返回一些渲染图而不是仅仅返回字符串。如下例所示

function ToRender(value: string | Range) {
  //if value is a string, just return the value
  if (typeof value === "string") return (<div>{value}</div>);

  //here the compiler knows it must be a Range
  //because it's not a string ...
  return (<div><span>{value.Start}</span> to <span>{value.End}</span></div>)
}

关于javascript - 访问对象映射中不同类型的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75993795/

相关文章:

javascript - 如何在react-native中控制打开/关闭模式

javascript - 检查 JSON 对象中是否存在键

SQL:分解数组

json - Elasticsearch:默认模板不检测日期

javascript - 使用 ramdajs 重命名对象的属性

javascript - react 不渲染?

javascript - 在js中绘制多个多边形

javascript - 使用日历库 codeigniter : Issue with Previous Button 显示 3 个月的日历,并在顶部显示上一个和下一个箭头

javascript - ReactJS - 如何为每个字符创建一个具有多种颜色的字符串

javascript - Reactify、Browserify 和 Gulp : TypeError: Object #<Transform> has no method 'transform'