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
问题是:
-
helpers.onChange
收到此错误“ 对象可能为‘未定义’。TS2532 ” - 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
不会为空。但这是一种糟糕的方法。
您应该做的是检查它是否不是
null
或
undefined
,然后继续:
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