【发布时间】:2020-05-02 13:21:39
【问题描述】:
我正在使用流式。
我猜以下两个代码是相同的,但上面的代码给出了错误。
以下两个代码有什么区别?
以及如何使用通用T 输入getMergedState 函数的参数而不指定getMergedState<State>
它得到一个错误:
(T 中缺少属性 foo,但存在于对象字面量中)
type State = {| foo: string, bar: string |}
function getState<T>(initialState: T) {
const getMergedState = (prevState: T, newState: $Shape<T>): T => ({
...prevState,
...newState
});
return [state, getMergedState];
}
const [state, getMergedState] = getState<State>({ foo: '1', bar: '2' });
const newState = getMergedState(state, { foo: '2' });
有效:
type State = {| foo: string, bar: string |}
function getState<T>(initialState: T) {
const getMergedState = <K>(prevState: K, newState: $Shape<K>): K => ({
...prevState,
...newState
});
return [state, getMergedState];
}
const [state, getMergedState] = getState<State>({ foo: '1', bar: '2' });
const newState = getMergedState<State>(state, { foo: '2' });
编辑:
我简化了代码以显示流程的链接,但犯了一些错误。
原代码:
function useMergeState<T>(initialState: T) {
const [state, setState] = React.useState<T>(initialState);
const setMergedState = (newState: $Shape<T>) =>
setState((prevState: T) => ({ ...prevState, ...newState }));
return [state, setMergedState];
}
type State = {|
text: ?string,
text2: ?string
|};
const getInitialState = (): State => {
return {
text: null,
text2: null
};
};
const Example = () => {
const [state, setState] = useMergeState<State>(getInitialState());
return (
<form>
<input
value={state.text}
onChange={event => {
setState({ text: event.target.value });
}}
/>
</form>
);
};
【问题讨论】:
-
getState的return语句中的state来自哪里?initialState应该在任何地方使用吗? -
@user11307804 对不起,我添加了原始代码
标签: javascript flowtype