有人可以指出我关于流类型函数交点背后的理论的综合指南吗?行为使我感到困惑。我了解这种类型:
type FnT = ((string) => string) & ((number) => string);
减少到(string | number) => (string & string)
,但是为什么我不能将参数强制转换为string
或number
?
即const g: FnT = (p: string) => { return "hi"; }
给了我
Cannot assign function to
g because string [1] is incompatible with number [2] in the first argument.
。
为什么? string
是string | number
的完全有效的子类型吗?
这是因为它需要超级类型吗?
如果是这种情况,那么为什么两个相同函数类型的并集可以让我将参数强制转换为另一个参数?
即
const FnT = ((string) => string) | ((number) => string)
与
const g: FnT = (p: string) => ("hi")
?我们难道不希望这里是string | number
的超类型吗?
答案 0 :(得分:0)
对于流,您需要在投放之前测试所有替代类型。
例如,如果您的类型是string|number
,并且要转换为数字,则必须首先测试它实际上不是字符串。
这是因为Flow不会尝试为您修改值,它只是类型检查器。您必须自己修改值,这意味着流程无法将数字“转换”为字符串,只能转换 type 。