2017-07-27 38 views
1
/* @flow */ 

type BaseProps = { 
    commonProp1: number, 
    commonProp2: string, 
} 

type Type1Props = BaseProps & { 
    type: 'type1', 
    extraProp1: boolean, 
} 

type Type2Props = BaseProps & { 
    type: 'type2', 
    extraProp2: number, 
} 

type Type = Type1Props | Type2Props; 

function dealWithType1({ props }: {props: Type1Props}) { 
    console.log('common prop 1', props.commonProp1); 
    console.log('type1 extra prop', props.extraProp1); 
} 
function dealWithType2({ props }: {props: Type2Props}) { 
    console.log('common prop 1', props.commonProp1); 
    console.log('type2 extra prop', props.extraProp2); 
} 

function branch({ props }: { props: Type }) { 
    const a = { 
    type1: dealWithType1, 
    type2: dealWithType2, 
    }[props.type]; 
    return a({props}); 
} 

above code调度功能表明分派任取决于属性type其它两个功能的功能(branch)。所有函数都接受一个对象,它具有在BaseProps中声明的共同数量的属性,而每个单独的调度函数处理一些额外的属性,这些属性取决于type。这些扩展对象被声明为BaseProps加上额外的交集。泛型类型被声明为所有可能的对象类型的不相交联合。与不同的签名

这是我的问题的简化版本,虽然它会产生相同的错误。在实际的情况下,所有的都是React无状态组件,所以基本上是函数,除了它们的首字母大写,并且被称为JSX组件:<A props={props} />。我正在展示上述简化版本,它仍然报告与实际的JSX版本相同的错误。

我的猜测是我应该明确声明a及其论点,并且我试图用几种方法做到这一点,但没有成功。实际的代码工作正常,就像在我开始尝试使用Flow之前一样。

谢谢。

回答

0

我偶然发现了解决方案,现在我明白了,这很有道理。我在泛型类型BaseProps声明type作为一种通用的string

type BaseProps = { 
    type: string, // <-- this was missing 
    commonProp1: number, 
    commonProp2: string, 
} 

声明它作为一个字符串是不是只有某些字符串值,允许其更具体的类型定义不兼容。