【问题标题】:How can I fix the following javascript code to make it work with flowtype?如何修复以下 javascript 代码以使其与 flowtype 一起使用?
【发布时间】:2017-06-01 10:37:12
【问题描述】:

鉴于以下 sn-p 我收到以下错误... 我该如何解决?

此类型与预期不兼容 返回数字枚举的类型。

type Size = 1 | 2 | 3;
const GetSize = (): Size => {
    const result: number = parseInt(Math.random() * 20);
    if (result > 3) {
        return 3;
    }
    return result;
};

你可以try it online...

编辑:

问题与从整数到枚举的转换有关。

【问题讨论】:

    标签: javascript ecmascript-6 babeljs flowtype


    【解决方案1】:

    Math.random() 返回 [0, 1) 之间的“浮点”数。所以它可以返回 0.5 或 0.31231。类型确实不兼容。即使它以相同的概率返回 0 或 1,您仍然会超出 Size 类型的限制。

    解决此问题的一种方法是执行return (int)result + 1 之类的操作。但我不知道 Flow 是否足够聪明,能够理解这一点。正确的方法是为您预期的所有情况使用if/elses,并根据这些情况明确返回 1、2 或 3。就像您正在为大于 3 的结果所做的那样。

    【讨论】:

      【解决方案2】:

      Math.random()返回一个0到1之间的随机数,返回类型为number

      您定义的返回类型比这更严格,它是1 | 2 | 3Math.random() 不符合你定义的返回类型,所以无法返回。这就是错误。

      【讨论】:

      • 谢谢,修复了不能解决流量问题的问题,添加了对该问题的解释。
      • @alejandrogarciarobles 如果您使用return 1 而不是return result 它可以工作。问题是您试图返回 number 而不是枚举中的内容。
      • 没错,我想知道为什么 flow 不理解下面的 if 语句并正确地将数字转换为数字枚举。
      • 因为number不能转换成number enum,所以number enum可以转换成number
      • 它不可转换,因为数字不是枚举的子类型。
      【解决方案3】:

      因为flow number 不是1 | 2 | 3 的子类型,所以无法转换它

      【讨论】:

        猜你喜欢
        • 2020-05-14
        • 2017-03-30
        • 2021-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-08
        • 2021-08-26
        • 2021-08-10
        相关资源
        最近更新 更多