Javascript flowtype:如何用内部函数接管泛型类型?
我正在使用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:$
我猜下面两个代码是相同的,但是上面的代码给出了一个错误 以下两种代码的区别是什么?
以及如何使用泛型
T
键入getMergedState
函数的参数,而不指定likegetMergedState
它得到一个错误:
(属性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>
);
};