jf1*_*234 7 javascript typescript redux
为什么我不能像这样简单地输入我的减速器,而不在我的 redux 状态类型中添加“| undefined”?
const reducer: Reducer<ReduxState> = function(state: ReduxState, action: any) ...
Run Code Online (Sandbox Code Playgroud)
额外的上下文::::
这工作正常:
export const reducer: Reducer<ReduxState | undefined> = function (
state: ReduxState | undefined,
action: any
) {
return state
}
export default reducer
Run Code Online (Sandbox Code Playgroud)
但是,从 fxn 中删除状态参数“未定义”时不会:
export const reducer: Reducer<ReduxState | undefined> = function (
state: ReduxState,
action: any
) {
return state
}
export default reducer
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误:
Type '(state: ReduxState, action: any) => ReduxState' is not assignable to type 'Reducer<ReduxState | undefined, AnyAction>'.
Types of parameters 'state' and 'state' are incompatible.
Type 'ReduxState | undefined' is not assignable to type 'ReduxState'.
Type 'undefined' is not assignable to type 'ReduxState'.ts(2322)
Run Code Online (Sandbox Code Playgroud)
或这个:
export const reducer: Reducer<ReduxState> = function (
state: ReduxState | undefined,
action: any
) {
return state
}
export default reducer
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误消息:
Type '(state: ReduxState | undefined, action: any) => ReduxState | undefined' is not assignable to type 'Reducer<ReduxState, AnyAction>'.
Type 'ReduxState | undefined' is not assignable to type 'ReduxState'.
Type 'undefined' is not assignable to type 'ReduxState'.ts(2322)
Run Code Online (Sandbox Code Playgroud)
最后,这也不起作用:
import {ReduxState, ReduxAction, ReduxActionType} from './types'
import {Reducer} from 'redux'
export const reducer: Reducer<ReduxState> = function (
state: ReduxState,
action: any
) {
return state
}
export default reducer
Run Code Online (Sandbox Code Playgroud)
错误消息为:
Type '(state: ReduxState, action: any) => ReduxState' is not assignable to type 'Reducer<ReduxState, AnyAction>'.
Types of parameters 'state' and 'state' are incompatible.
Type 'ReduxState | undefined' is not assignable to type 'ReduxState'.
Type 'undefined' is not assignable to type 'ReduxState'.ts(2322)
TL; DR:打字稿是不满意我减速,除非我特别允许“ReduxState |未定义”类型中均Reducer<ReduxState|undefined>和function(state: ReduxState | undefined)。
因为对于初始状态,之前的状态是未定义的。因此你的函数必须能够处理statebeing undefined,这就是第一个错误告诉你的。
第二个版本不起作用,因为您return state, 并且可以未定义(因为您不检查它是否未定义),因此该函数的返回类型(它是 的通用参数Reducer)也必须是可能未定义。你可以预防:
if(state === undefined)
return { /*...*/ };
else return state;
Run Code Online (Sandbox Code Playgroud)
然后Reducer<ReduxState>将正确描述类型。