如何在流程中检查多态函数?

时间:2018-02-07 13:15:42

标签: javascript flowtype

我在Flow中遇到多态函数问题。

type A = { id: string };
type B = { id: number };

function takeId(x) {
  return x.id;
}

const a: A = { id: 'akn2' };
const b: B = { id: 14 }; 

(takeId(a) : string);
// Error 
(takeId(b) : number);
// Error 

据我所知,流引擎会根据上下文和调用它们的位置输入多态函数。

在这种情况下,我认为takeId将具有以下类型:(A|B) => (string | number)。这可能就是为什么我无法将回报转换为真实类型。

此外,如果我使用以下类型takeId投射(A => string) | (B => number),代码仍然没有进行类型检查;

如何使用Flow返回多态函数类型检查,而不会失去安全性(例如,没有any)?

如果不可能,那么实现相同结果的因果方式是什么(分解takeId)?

由于

1 个答案:

答案 0 :(得分:0)

您的示例中的问题是Flow无法优化返回类型,因为它不知道输出类型如何与输入类型相关联。 你可以做类似的事情来表达这种关系:

 <Style x:Key="SelectButton" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="False">
                <Setter Property="Content">
                    <Setter.Value>
                        <Image Source="\directory"/>
                    </Setter.Value>
                </Setter>
                <Setter Property="Margin">
                    <Setter.Value>
                        <Thickness Bottom="10" Right="10" Top="10" Left="10"/>
                    </Setter.Value>
                </Setter>
            </Trigger>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Content">
                    <Setter.Value>
                        <Image Source ="\directory"/>
                    </Setter.Value>
                </Setter>
                <Setter Property="Margin">
                    <Setter.Value>
                        <Thickness Bottom="0" Right="0" Top="0" Left="0"/>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>

希望有所帮助