以下代码导致错误:
type NextItem = string | { [string]: string };
const next: NextItem = 'foo';
const isString = typeof next === 'string';
const toName = isString ? next : Object.keys(next)[0];
^ string [1] is not an object.
但是摆脱isString
变量可以解决此问题:
type NextItem = string | { [string]: string };
const next: NextItem = 'foo';
const toName = typeof next === 'string' ? next : Object.keys(next)[0];
我了解为什么,但我希望有人可能会提供更好的解决方案。我需要重用isString
变量,并希望使我的代码既干燥又简单(易于阅读)。因此,请不要使用任何“聪明的”(hacky)解决方案。
答案 0 :(得分:1)
Flow的优化通常基于使用时的直接检查,因此它只会将您的isString
变量视为boolean
,没有特殊含义。
这为您提供了一些单独的选择:
isString
有更多的检查,您始终可以创建一个清晰的分支来处理这两种情况。内联typeof next === 'string'
检查。
const toName = typeof next === 'string' ? next : Object.keys(next)[0];
使用predicate function集中isString
逻辑
function isString(arg: mixed): boolean %checks {
return typeof arg === "string";
}
const toName = isString(next) ? next : Object.keys(next)[0];