为什么Flow无法使用字符串鉴别器通过我的操作类型进行优化?

时间:2017-07-03 10:40:29

标签: flowtype

我正在使用Flow在Redux应用程序中编写Reducer。我的reducer操作需要两种操作,NumberActionStringAction

NumberAction具有numberValue属性,而StringAction具有stringValue属性。而且,作为Redux操作,它们都具有type属性,分别为NUMBER_ACTIONSTRING_ACTION。我测试action.type以确定switch语句中正在处理的操作类型。

我理解the documentation的方式,这应该足以让Flow确定action的类型。但是,当我尝试访问给定操作类型中不存在的属性时,它不会给我一个错误。完整代码:

// @flow
export type NumberAction = {|
    type : 'NUMBER_ACTION',
    numberValue : number
|}

export type StringAction = {|
    type : 'STRING_ACTION',
    stringValue : string
|}

type Action = | NumberAction | StringAction;

export default function my(action : Action) {
    switch (action.type) {
        case 'NUMBER_ACTION' : {
            let value : number = action.numberValue;
            console.log("value = ", value);
            break;
        }
        case 'STRING_VALUE' : {
            let value : number = action.numberValue; // This should error, because StringAction doesn't have a numberValue property
            console.log("value = ", value);
            break;
        }
    }
}

为什么我在STRING_VALUE案例中尝试访问action.numberValue时未收到错误?

但是,如果我使用整数作为动作标识符,我会收到预期的错误:

// @flow
export type NumberAction = {|
    type : 1, // Note: number
    numberValue : number
|}

export type StringAction = {|
    type : 2, // Note: number
    stringValue : string
|}

type Action = | NumberAction | StringAction;

export default function my(action : Action) {
    switch (action.type) {
        case 1 : {
            let value : number = action.numberValue;
            console.log("value = ", value);
            break;
        }
        case 2 : {
            let value : number = action.numberValue; // This errors: Flow: property `numberValue`. Property not found in object type. 
            console.log("value = ", value);
            break;
        }
    }
}

我不应该这样使用字符串作为类型鉴别器吗?

1 个答案:

答案 0 :(得分:0)

这似乎是Flow 0.48.0中的一个错误。

更新到Flow 0.49.1时,问题就消失了。