javascript - 根据变量的类型调用不同的函数时,正确的 Flow 类型模式是什么?

标签 javascript flowtype

我是 Flow 的新手,从 javascript 中的“随心所欲地使用代码”风格更改为更严格的输入 Flow 有时会让您感到痛苦。

我有一个带有返回以下函数的类:

const { id: idParam, params } = this.config[tag];
return params.map((param: string | ObjectConfigParam) => {
  const paramType = typeof param;
  let ret = { id: element.id, tag, position };
  if (paramType === 'string') {
    ret = { ...ret, ...this.resolveStringParam(element, param) };
  } else if (paramType === 'object') {
    ret = { ...ret, ...this.resolveObjectParam(element, param) };
  }
  return ret;
})

因为 params 可以是两个不同的东西(一个简单的 string 或一个更复杂的 ObjectConfigParam)我定义了不同的函数来处理他们。函数的签名是:

resolveStringParam(element: any, param: string): 字段

resolveObjectParam(element: any, param: ObjectConfigParam): 字段

运行流量检查器报如下错误: 无法调用 this.resolveStringParam 并将参数绑定(bind)到 param,因为 ObjectConfigParam [1] 与字符串 [2] 不兼容。 对于第一个电话和 无法调用 this.resolveObjectParam 并将参数绑定(bind)到 param,因为字符串 [1] 与 ObjectConfigParam [2] 不兼容。 对于第二个。

最佳答案

您需要将 typeof param 放在 if 条件中。 顺便说一下,您不需要第二个 if

https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoVAXAngBwKZgDyARgFZ4DGGAwnAHZQCWA5gAoCGATuwLZgC8YAN5gAznB54AauxgBXPAC4xGTozrMwAXwDc6VFDl0qjemE55xMAG54AyqvVsuvABSjVyj2o0BKYVoGRiZmFla2JORUHNw8rnBkypGUNPRMzrH+QoGoFPQeYAAeAmCuOC48Xo4aYAA+RGQptAwsMbz+-AB8wqhgYIxQpdj4cIPlsQL8ggDk3k7TWb195pZwNvbVGW7j7Xp9WmB4MKIEQkt9YWsRjdEVZRW+e9qoWkA

type ObjectConfigParam = { someValue: string };

function resolveStringParam(str: string) {}
function resolveObjectParam(obj: ObjectConfigParam) {}

const x = (param: string | ObjectConfigParam) => {
  if (typeof param === 'string') {
    resolveStringParam(param);
  } else {
    resolveObjectParam(param);
  }
}

关于javascript - 根据变量的类型调用不同的函数时,正确的 Flow 类型模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58546672/

相关文章:

javascript - React JS - 如何在更新状态 [Hooks] 之前防止渲染

javascript - 使用 javascript 检查小数位是否等于 0.9

javascript - 开 Jest : Vue Component can't find mocked function

javascript - 如何将成员添加到 flowjs 中的现有定义

javascript - 流量: Promise incompatible with array type in async function

javascript - 在 Flow 中,我可以声明一个函数签名,以便我可以在任何地方重用它吗?

javascript - Highcharts 同步图表与其他图表结合

javascript - 如何使用 css 媒体查询隐藏以编程方式添加的 html 元素?

reactjs - React PropTypes 与 Flow

javascript - 为什么在这种情况下流会显示错误?