开发者问题收集

React Typescript 中的 Props“对象可能为‘未定义’”

2021-01-27
7531

我是 Typescript 新手,在 React Typescript 中遇到了一个我不理解的错误。我怀疑它来自我编写界面的方式,但我不确定。

首先,我调用我的 CellEditable 组件

<CellEditable value={'Hello'} onChange={() => {}} />

CEllEditable 有一个 isEditable 状态,单击时切换 InputText

CellEditable.tsx

import React, { useState } from 'react'
import Cell from './Cell.comp'
import InputText from './InputText.comp'

interface CellEditableProps {
  value: string
  onChange?: () => void
}

const renderCellInput = (type: string, opts: any) => {
  switch (type) {
    case 'text':
      return <InputText {...opts} />
    default:
      return <div>Missing!</div>
  }
}

const CellEditable = (props: CellEditableProps) => {
  const { value, onChange } = props
  const [isEditing, setEditing] = useState<boolean>(false)

  const handleClick = () => setEditing(!isEditing)
  const handleBlur = () => setEditing(!isEditing)

  const opts = {
    value,
    helpers: {
      onBlur: handleBlur,
      onChange
    }
  }

  return (
    <div onClick={handleClick}>
      {
        isEditing
        ? renderCellInput('text', opts)
        : <Cell value={value} />
      }
    </div>
  )
}

export default CellEditable

InputText.tsx

import React from 'react'

interface InputTextProps {
  value?: string
  helpers?: HelpersProps
}

interface HelpersProps {
  onChange?: () => void
  onBlur?: () => void
}

const InputText = (props: InputTextProps) => {
  const { value, helpers } = props
  console.log('propsInputText:', props) // Empty object in the console
  
  return (
    <input type={'text'} value={value} onChange={helpers.onChange} onBlur={helpers.onBlur} />
  )
}

export default InputText

问题是:

  1. helpers.onChange 收到此错误“ 对象可能为‘未定义’。TS2532
  2. InputText.tsx 中的 console.log('propsInputText:', props) 输出一个空对象。

这是 typescript 的问题吗?我写我的界面?

3个回答

InputTextProps 中的 helpers 属性和 HelpersProps 中的 onChange 属性是可选的。可以通过删除问号使其成为必需属性,或者在析构时为它们分配默认值。

const { value, helpers = {} } = props;
const { onChange = () => {} } = helpers;

 return (
    <input type={'text'} value={value} onChange={onChange} onBlur={helpers.onBlur} />
  )
fullstack
2021-01-27

在您的界面内:

interface CellEditableProps {
  value: string
  onChange?: () => void
}

您在 onChange 之后放置了一个 ? ,这告诉编译器它不能被传递,因此您得到 “对象可能是‘未定义’

要解决这个问题,您可以将 onChange! 一起使用,如 onChange! 。这让编译器确信 onChange 不会为空。但这是一种糟糕的方法。

您应该做的是检查它是否不是 nullundefined ,然后继续:

if(onChange) {
    ...do your stuff here
}
Shivam Jha
2021-01-27

您的接口声明明确指出这些确实可以未定义( ? 将这些属性标记为可选)。您需要检查它们是否存在或填充它们。

const value = props.value || '';
const helpers = {
   onChange: () => {},
   onBlur: () => {},
   ...(props.helpers || {}),
};

return (
    <input type={'text'} value={value} onChange={helpers.onChange} onBlur={helpers.onBlur} />
)

或类似内容。

Mr.Manhattan
2021-01-27