Javascript flowtype:如何用内部函数接管泛型类型?

Javascript flowtype:如何用内部函数接管泛型类型?,javascript,flowtype,Javascript,Flowtype,我正在使用flowtype。 我猜下面两个代码是相同的,但是上面的代码给出了一个错误 以下两种代码的区别是什么? 以及如何使用泛型T键入getMergedState函数的参数,而不指定likegetMergedState 它得到一个错误: (属性foo在T中缺失,但存在于对象文字中) type State={foo:string,bar:string} 函数getState(initialState:T){ const getMergedState=(prevState:T,newState:$

我正在使用flowtype。
我猜下面两个代码是相同的,但是上面的代码给出了一个错误

以下两种代码的区别是什么?
以及如何使用泛型
T
键入
getMergedState
函数的参数,而不指定like
getMergedState

它得到一个错误: (属性
foo
T
中缺失,但存在于对象文字中)

type State={foo:string,bar:string}
函数getState(initialState:T){
const getMergedState=(prevState:T,newState:$Shape):T=>({
…国家,
…新闻状态
});
返回[状态,getMergedState];
}
const[state,getMergedState]=getState({foo:'1',bar:'2'});
const newState=getMergedState(状态,{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' });
type State={foo:string,bar:string}
函数getState(initialState:T){
const getMergedState=(prevState:K,newState:$Shape):K=>({
…国家,
…新闻状态
});
返回[状态,getMergedState];
}
const[state,getMergedState]=getState({foo:'1',bar:'2'});
const newState=getMergedState(状态,{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>
  );
};
函数useMergeState(初始状态:T){
const[state,setState]=React.useState(initialState);
const setMergedState=(newState:$Shape)=>
setState((prevState:T)=>({…prevState,…newState}));
返回[状态,setMergedState];
}
类型状态={|
文本:?字符串,
text2:?字符串
|};
const getInitialState=():State=>{
返回{
文本:空,
text2:null
};
};
常量示例=()=>{
const[state,setState]=useMergeState(getInitialState());
返回(
{
setState({text:event.target.value});
}}
/>
);
};

我在v0.116.0上使用以下代码进行了所有类型检查:

import*as React from“React”;
函数useMergeState(initialState:T):[T$Shape=>void]{
const[state,setState]=React.useState(initialState);
const setMergedState=(newState:$Shape)=>
setState((prevState:T):T=>({…prevState,…newState}));
返回[状态,setMergedState];
}
类型状态={|
文本:?字符串,
text2:?字符串
|};
const getInitialState=():State=>{
返回{
文本:空,
text2:null
};
};
常量示例=()=>{
const[state,setState]=useMergeState(getInitialState());
返回(
{
setState({text:event.target.value});
}}
/>
);
};


主要的变化是将
T
子类型化为对象(
T:{}
),指定
useMergeState
的返回类型(
[T$Shape=>void]
),以及在
useMergeState
中指定
setState
的返回类型(
T
)。(我还添加了从react for Try Flow的导入。)如果您使用
状态
类型定义中未显示的属性调用
设置状态
,或者如果值类型不合适(例如,将数字设置为
文本
的值),则代码将出错.

getState
return
语句中的
state
在哪里?
initialState
应该在任何地方使用吗?@user11307804对不起,我添加了原始代码
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>
  );
};