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,跳过类型校验:
注意:该方案本质是绕开TS校验,如果后续逻辑变更导致id真的为undefined,会触发运行时错误,非必要不优先使用。<Text style={styles.item} onPress={() => onPressItem(item?.id!)}>{item?.title}</Text>
附带代码语法修正
你贴的原始代码存在基础语法错误,会直接导致编译失败,需要同步调整:
MeetingListProps接口的闭合括号位置错误,解构onPressItem的逻辑需要写在接口外部的组件内部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
相关产品推荐
相关产品推荐

