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之前一样。
谢谢。