有人可以解释一下,为什么流程是对象属性时,流程不接受约束类型较少的参数来期望约束类型较少的函数?
/* @flow */
type Input = {
type: string,
};
type Output = {
type: 'Nav',
}
const foo = (): Output => ({
type: 'Nav',
});
const bar = (input: Input) => {
console.log('input', input);
}
bar(foo());
错误:
19: bar(foo());
^ Cannot call `bar` with `foo()` bound to `input` because string literal `Nav` [1] is incompatible with string [2] in property `type`.
References:
8: type: 'Nav',
^ [1]
4: type: string,
^ [2]
我想念文档中的东西吗?
答案 0 :(得分:1)
variance上的文档应该使您开始理解为什么更具体的输入会带来麻烦。在您的情况下,Flow不知道您的函数将如何处理输入,因此担心bar
会修改其输入。例如,bar
可能会将input.type
更改为'some string'
,这将违反Output
类型。您可以将input
标记为$ReadOnly<Input>
类型,以向Flow提供保证,bar
不会修改input
。