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

TS传id参数报错:Type 'undefined'无法赋值给type 'number'

报错根因

使用可选链操作符item?.id时,TypeScript会推导该表达式的返回类型为number | undefined——当item为undefined时,整个表达式会返回undefined,但onPressItem的类型定义明确要求入参必须为number,类型不匹配就会触发该报错。

可落地的修复方案

根据业务场景选以下任意一种即可:

  • 方案1:移除不必要的可选链(推荐优先用)
    现有代码已经做了前置判断:data?.meetings &&校验通过后才会执行data.meetings.map,此时遍历出的item是数组内的有效成员,本身不存在undefined的可能;如果Meetings类型中id是必填的number字段,完全不需要给item加可选链,直接取值即可通过类型校验:
    {data?.meetings &&
      data.meetings.map((item) => {
        return (
          <View>
            <Text style={styles.item} onPress={() => onPressItem(item.id)}>{item.title}</Text>
          </View>
        )
      })}
    
  • 方案2:加类型收窄判断(最严谨,适合id本身可能可选的场景)
    如果Meetings类型中id本身是可选字段(定义为id?: number),就在调用回调前做类型判断,仅当id为有效number值时才触发回调,从根源避免undefined传入:
    <Text
      style={styles.item}
      onPress={() => {
        if (typeof item?.id === 'number') {
          onPressItem(item.id)
        }
        // 也可以根据业务需求加id不存在时的兜底逻辑,比如埋点报错、提示等
      }}
    >
      {item?.title}
    </Text>
    
    如果业务允许传默认兜底值,也可以用空值合并运算符简化写法:onPressItem(item?.id ?? 0),当id为undefined/null时自动传入0作为合法number参数。
  • 方案3:非空断言(快速修复,仅适合100%确定id必传的场景)
    在表达式后加!非空断言操作符,手动告诉TypeScript该值不可能为undefined,跳过类型校验:
    <Text style={styles.item} onPress={() => onPressItem(item?.id!)}>{item?.title}</Text>
    
    注意:该方案本质是绕开TS校验,如果后续逻辑变更导致id真的为undefined,会触发运行时错误,非必要不优先使用。
附带代码语法修正

你贴的原始代码存在基础语法错误,会直接导致编译失败,需要同步调整:

  1. MeetingListProps接口的闭合括号位置错误,解构onPressItem的逻辑需要写在接口外部的组件内部
  2. useGetMeetingsQuery是自定义hook,需要加括号执行才能拿到返回值
    修正后的基础结构参考:
export interface MeetingListProps {
  data?: Meetings
  style?: StyleProp<ViewStyle>
  onPressItem: (id: number) => void
}

// 组件内部逻辑
const { onPressItem } = props
const { data, loading, error } = useGetMeetingsQuery()

内容的提问来源于stack exchange,提问作者Toufiqur Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:48:28