为什么Flow无法使用方法参数的默认值推断类型

时间:2019-04-24 10:52:57

标签: javascript flowtype

编写此方法时:

   // @flow

   function greeting (name: string = 8): string {
    return `Hello ${name}!!`
   }

请检查默认值是否正确,对我来说还可以,但是使用以下代码:

   // @flow

   function greeting (name = 'world'): string {
    return `Hello ${name}!!`
   }

   greeting(8)

使用数字参数没有错误,就像我期望的那样

   function greeting (name: string = 'world'): string {
    return `Hello ${name}!!`
   }

为什么不能用默认值推断类型?

谢谢。

1 个答案:

答案 0 :(得分:1)

那是因为在您的示例中,该函数返回一个字符串,但是没有为name参数声明类型。

由于要使用反引号(``)将name插入字符串中,因此即使它是数字,其类型也会隐式转换为字符串。 因此,只要您返回一个字符串-您的符号就可以了。

如果您希望流程出错,可以执行以下操作:

function greeting (name: string = "name"): string {
    return `Hello ${name}!!`
   }

然后在您这样称呼它时:

greeting(8);

您将收到以下错误:

greeting(8)
            ^ Cannot call `greeting` with `8` bound to `name` because number [1] is incompatible with string [2].
References:
6: greeting(8)
            ^ [1]
2: function greeting (name: string = "name"): string {

整个事情都围绕着推理。 想象以下情况:

function(name: string | number = "name") {.. 在这种表示法中,name可以是字符串,也可以是数字。

Flow无法通过默认值知道您的意图,因此它将所有内容推断为any