某些背景
我正在制作一个表单(使用react-final-form),并监视某些表单的状态。
该库提供了一个React组件(FormSpy
),它允许您订阅表单状态各个部分的更改,并仅使用表单状态的那些部分调用回调函数(从不{{1表单状态确实发生变化时。}或null
)。
相关代码的简化版
undefined
...并且只订阅对表单的// Represents the current state of the form.
// values is an object with each field in the form as a key
// submitting is true if a submission is currently in progress
type FormState = {
values?: Object,
submitting?: boolean,
};
// Indicate which form state changes to subscribe to
type Subscription = {
values?: boolean,
submitting?: boolean,
};
type RenderCallback = (formState: FormState) => React.Node;
// The function that is automatically called with the subscribed-to parts of the form state when something changes
function FormSpy(subscription: Subscription, render: RenderCallback) {
// This is available to the component
const relevantFormState = getRelevantFormStateBySubscription(subscription);
// Call the callback with the relevant form state
return render(relevantFormState);
}
(非values
状态)的更改,您可以像这样使用它(假设表单有一个名为“email”的字段,其值为“ test@test.xyz“:
submitting
我的问题
当人们阅读代码时,我们知道function renderEmail = ({ values: { email }}) {
return <div>{email}</div>;
}
const theSpy = (
<FormSpy
subscription={{ values: true }}
renderCallback={renderEmail}
/>
);
将是一个对象,因为我们只是订阅了values
。
但是,values
是values
类型中的Maybe
类型,因此Flow会强制我们在访问其中的任何内容之前检查FormState
是否存在(在这种情况下,选择values
)。
这样可以正常工作,但不必要地膨胀:
email
我也可以通过将function renderEmail({ values }) {
if (values == null) {
throw new Error('This never happens because of our subscription');
}
return <div>{values.email}</div>;
}
const theSpy = (
<FormSpy
subscription={{ values: true }}
renderCallback={renderEmail}
/>
);
置于我构造// $FlowFixMe
的行的上方来解决问题,但这也会使该行上的所有其他错误无效并且无法解决我的问题。
我的问题
是否可以使用values
参数中的对象键来派生可用作subscription
的参数类型的类型,这样我们就不必执行这些不必要的null / undefined check?
也就是说,如果renderCallback
带有subscription
,我想创建values: true
的专用版本,例如FormState
,而不是{ values: Object }
。
密钥在{ values?: Object, submitting?: booolean }
和subscription
中始终具有相同的名称 - 我不确定这是否重要。
可以这样做吗?