【问题标题】:Why Flow can not infer type with default value of method parameter为什么 Flow 不能用方法参数的默认值推断类型
【发布时间】:2019-04-25 22:12:55
【问题描述】:

当您编写此方法时:

   // @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}!!`
   }

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

提前致谢。

【问题讨论】:

    标签: javascript flowtype


    【解决方案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

    【讨论】:

    • 因为默认值不描述类型:你可以轻松做到:function(name: string | number = 'name') 那么为什么 flow 应该假设它不是“任何”?
    • 感谢您的回答,但我的问题是为什么function greeting (name = 'world'): stringfunction greeting (name: string = 'world'): string 不一样。为什么name = 'world' != name: string?在打字稿中,方法参数的类型是通过值推断出来的。
    • 整个事情都围绕着推理。想象以下情况:function(name: string | number = "name")... 在这种表示法中,名称可以是字符串或数字。 Flow 无法通过默认值了解您的意图,因此它将所有内容推断为 any
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2016-10-11
    • 2016-11-24
    • 2019-02-11
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多