如何将`mixed`细化为`T []`?

时间:2018-03-26 21:06:27

标签: flowtype

假设我有一些x: mixed,我想将其优化为string[],否则会抛出错误。

很明显如何将其细化为数组Array.isArray(x));但是我怎样才能让Flow了解这是一个每个元素类型为string的数组?

1 个答案:

答案 0 :(得分:2)

不使用any执行此操作需要创建一个新数组,例如

function toStringArray(vals: mixed): Array<string> {
  if (!Array.isArray(vals)) throw new Error("...");

  return vals.reduce((acc, item) => {
    if (typeof item !== "string") throw new Error("...");
    acc.push(item);
    return acc;
  }, []);
}

应该是相对不言自明的。

如果由于某种原因你绝对需要返回相同的数组,你也可以使用any,例如

function toStringArrayIdent(vals: mixed): Array<string> {
  if (!Array.isArray(vals)) throw new Error("...");

  vals.forEach(item => {
    if (typeof item !== "string") throw new Error("...");
  });

  return (vals: any);
}

但这有一个缺点,即Flow无法完全保证vals之后的事情会再次发生变化,例如

var vals: mixed = ['one', 'two'];
var strs = toStringArrayIdent(vals);

if (Array.isArray(vals)) vals.push(4);

即使推送number也不会出错。