使用Flow,有时我想表示某种类型的对象,但任何字段可能是undefined
或null
。
例如,在验证T
类型的对象时,在验证之前我知道我的某些内容看起来像T
但可能缺少某些字段。验证成功后,我知道我有一个T
,每次使用时都不需要对所有字段进行空值检查。
type T = { a: number, b: number }
type MaybeT = { a: ?number, b: ?number }
const validate = (candidate: MaybeT): T => {
if (!candidate.a || !candidate.b) {
throw 'Invalid'
}
return { a: candidate.a, b: candidate.b }
}
const maybeT: MaybeT = getInputFromUser()
const t: T = validate(maybeT)
doStuffKnowingAllFieldsOfTAreDefined(t)
显然,对MaybeT
的重新定义是冗长的,如果我修改T
,我现在也必须记得修改MaybeT
。
我的问题:
在Flow中是否有某种简写,例如$WithAllFieldsMaybe<T>
,所以我可以从MaybeT
派生T
而无需手动执行此操作?< / p>
如果没有,是否有更好的模式,而不需要使用两种不同的类型?据我所知,没有办法让Flow'知道'validate
之后所有字段都存在,因为,例如,我可以在validate
运行后将字段设置为空 - 所以我在这里看不到使用单一类型的方法。
答案 0 :(得分:3)
允许任何字段为type Person = {
name: string,
age: number
}
type OptionalPerson = $Shape<Person>
:
null
允许任何字段为type Person = {
name: string,
age: number
}
type NullablePerson = $ObjMap<Person, <V>() => ?V>
:
undefined
允许任何字段为null
或type Person = {
name: string,
age: number
}
type MaybePerson = $Shape<$ObjMap<Person, <V>() => ?V>>
:
type Maybe<T> = $Shape<$ObjMap<T, <V>() => ?V>>
type Person = {
name: string,
age: number
}
type MaybePerson = Maybe<Person>
如果您需要经常使用此模式,可以为自己创建可重用的实用程序类型。例如:
$Shape
参考文献:
$ObjMap
:未在Flow文档中记录。您可以在此处阅读:http://sitr.us/2015/05/31/advanced-features-in-flow.html#shapet
<div id="btn">
<input type="button" onclick="hideImage();" value="A" class="btn-group" />
</div>
<div id="images">
<img src="Letter-A.png" class="image-group"></img>
</div>
:https://flow.org/en/docs/types/utilities/#toc-objmap