You need to enable JavaScript to run this app. 如何给React组件props定义可接收ICreateTodoInput或IEditTodoInput的类型
优惠活动
大模型
产品
解决方案
定价
更多

如何给React组件props定义可接收ICreateTodoInput或IEditTodoInput的类型

你写的EitherOr泛型不需要使用,直接用联合类型定义todoInput即可,报错的核心原因是:TS默认不允许访问联合类型的非共有属性,你需要先做类型收窄,告诉TS当前的todoInput属于哪一种接口类型。

1. 完成Props类型定义

interface ITodoMutatorProps{
  todoInput?: ICreateTodoInput | IEditTodoInput
}

2. 组件内部做类型收窄

因为IEditTodoInput独有todoId属性,ICreateTodoInput没有该属性,直接用in操作符判断即可实现类型自动收窄:

export const TodoMutator = ({
  todoInput 
}: ITodoMutatorProps): JSX.Element => {
  const submitHandler = () => {
    // 先处理可选值为空的情况
    if (!todoInput) return

    if ('todoId' in todoInput) {
      // 此处TS会自动将todoInput收窄为IEditTodoInput类型,可正常访问todoId
      // 发起编辑请求
      editTodoApi(todoInput)
    } else {
      // 此处TS会自动将todoInput收窄为ICreateTodoInput类型
      // 发起创建请求
      createTodoApi(todoInput)
    }
  }

  // 其余组件渲染逻辑
}

可选优化:自定义类型守卫

如果需要多处判断类型,可以封装自定义类型守卫提升可读性:

function isEditTodoInput(input: ICreateTodoInput | IEditTodoInput): input is IEditTodoInput {
  return 'todoId' in input
}

// 组件内使用
if (isEditTodoInput(todoInput)) {
  editTodoApi(todoInput)
} else {
  createTodoApi(todoInput)
}

内容的提问来源于stack exchange,提问作者Joseph Hailu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 07:09:02