【发布时间】:2021-06-29 05:09:12
【问题描述】:
我有一个组件可以处于两种不同的状态,编辑模式和查看模式。为了适应这一点,我有一个联合类型来完成这项工作,但我仍然在我的组件的 args 中收到 TypeScript 抱怨:
type View = {
isEditing: false;
viewHandler: () => void;
someOtherProp: any // this is unique to view mode
};
type Edit = {
isEditing: true;
editHandler: (id: string) => void;
};
export type MyProps = View | Edit;
然后在这里抱怨:
const Item: React.FC<MyProps> = ({
isEditing = false,
editHandler,
~~~~~~~~~~~
}) => {
Property 'editHandler' does not exist on type 'PropsWithChildren<MyProps>'.
我错过了什么?
【问题讨论】:
-
所以,如果
isEditing是false,你希望它是View,如果没有提供isEditing,或者true它是Edit,同时如果isEditing未提供(Edit模式),您将其默认为false(View模式)。您能否举例说明您打算如何使用该组件? -
在编辑模式下,它真的不应该是可选的,这是一个疏忽,所以组件要么处于编辑模式,要么处于查看模式,根据它所处的模式,我们渲染不同的子组件,我们将处理程序传递到。我们将处理程序一直沿树向下传递,以在页面级别管理我们的状态并将逻辑保持在一个位置。
-
也许
type View = { isEditing?: false;editHandler: undefined};和type Edit = {isEditing: true;editHandler: (id: string) => void;};对你有用?或者最好还是做 2 个组件 -
不,已经尝试过了,然后我在调用处理程序时得到
Cannot invoke an object which is possibly 'undefined'. -
使用
!让 TS 知道某些东西不是 null /undefinededitHandler!()
标签: reactjs typescript react-typescript