2017-08-26 94 views
2

我正在写一个终极版减速时,我发现这个代码:打字稿未定义强迫

export function users(state: { myself: IUser | undefined, users: IUser[] } = { myself: undefined, users: [] }, action: UserActions) { 
    const mself = state.myself; 
    if (action.type === EMyselfAction.CHANGE_MYSELF_CONFIG && state.myself !== undefined) { 
    return { 
     myself: myself(mself, action), 
     users: state.users.map((u) => user(u, action, state.myself.id)), 
    }; 
    } 
    ... 
} 

是输出错误对象可能是“未定义”:

enter image description here

怎么能state.myself未定义,如果它已被检查,它不是?

+0

的可能的复制【如何抑制打字稿?“错误TS2533:对象可能是‘空’或‘未定义’”](https://stackoverflow.com/questions/40349987/如何禁止打字脚本错误ts2533对象是可能null或undefine) – k0pernikus

+0

您能否请将错误消息作为文本发布,而不是只发布它作为截图?这可能会帮助其他人面临同样的错误通过谷歌找到问题。 – k0pernikus

+0

由于断言('T is' type guard或'!== null'检查),TS不会总是“改变”参数的类型。你可能有更好的运气用'mself'替换'state.myself'并声明反对(局部变量更容易改变)。 – ssube

回答

2

我认为这是因为state.myself是在不同的范围。

export function users(state: { myself: IUser | undefined, users: IUser[] } = { myself: undefined, users: [] }, action: UserActions) { 
    const mself = state.myself; 
    if (action.type === EMyselfAction.CHANGE_MYSELF_CONFIG && state.myself !== undefined) { 
    state.myself // (property) myself: IUser 

    const foo =() => { 
     state.myself // but here is (property) myself: IUser | undefined 
    } 
    // ... 
    } 
    ... 
} 

我不认为你可以以其它方式保证,因为你可以使用它在其他地方(不仅在该分支那里state.myself !== undefined)。所以,你可以这样做:

export function users(state: { myself: IUser | undefined, users: IUser[] } = { myself: undefined, users: [] }, action: UserActions) { 
    const mself = state.myself; 
    if (action.type === EMyselfAction.CHANGE_MYSELF_CONFIG && state.myself !== undefined) { 
    const id = state.myself.id; 
    return { 
     myself: myself(mself, action), 
     users: state.users.map((u) => user(u, action, id)), 
    }; 
    } 
    ... 
}