将带有枚举的属性传递给带有字符串的期望属性的函数

时间:2019-06-03 13:57:51

标签: javascript flowtype

有人可以解释一下,为什么流程是对象属性时,流程不接受约束类型较少的参数来期望约束类型较少的函数?

https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoVAXAngBwKZgCSAdjgK4ZgC8YA3qmGNvgFxgDOGATgJbEDmAGlQBfANzpmBAPIVylGvUZS2AcgByAQwBuq4SPQBjOMU5gocONTAAKAJRtZGedQB8tpU1x41W3frsJVGNTSgAjTS5rGz55NhJ5Ozc6BjAQ9jgYPAA6eH4bVViKPTAijECwUXQIrhsLOHtAoA

/* @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]

我想念文档中的东西吗?

1 个答案:

答案 0 :(得分:1)

variance上的文档应该使您开始理解为什么更具体的输入会带来麻烦。在您的情况下,Flow不知道您的函数将如何处理输入,因此担心bar会修改其输入。例如,bar可能会将input.type更改为'some string',这将违反Output类型。您可以将input标记为$ReadOnly<Input>类型,以向Flow提供保证,bar不会修改input