猿问

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

有人可以解释一下,当它是对象属性时,为什么 flow 不接受更多限制类型的参数来运行期望更少限制类型的函数?


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]

我是否遗漏了文档中的某些内容?


呼如林
浏览 142回答 1
1回答

慕桂英4014372

关于方差的文档应该让您开始了解为什么更具体的输入很麻烦。在您的情况下,Flow 不知道您的函数将如何处理输入,因此担心bar可能会修改其输入。例如,bar可能会更改input.type为'some string',这将违反Output类型。您可以标记input为一种$ReadOnly<Input>类型,以便为 Flow 提供bar不会修改的保证input。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答