假设我有一些x: mixed
,我想将其优化为string[]
,否则会抛出错误。
很明显如何将其细化为数组(Array.isArray(x)
);但是我怎样才能让Flow了解这是一个每个元素类型为string
的数组?
答案 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
也不会出错。