使用 Flow,有时我想表示某种类型的对象,但任何字段都可以是undefined或null。
例如,当验证 类型的对象时T,在验证之前我知道我有一些看起来像 a 的东西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)
Run Code Online (Sandbox Code Playgroud)
显然,这个重新定义MaybeT是冗长的,如果我修改,T我现在还必须记住修改MaybeT。
我的问题:
Flow 中是否有某种简写形式,即类似 的东西$WithAllFieldsMaybe<T>,这样我就可以MaybeT从中派生T而无需手动执行?
如果没有,是否有更好的模式,而不需要使用两种单独的类型?据我所知,没有办法让 Flow “知道”所有字段都存在validate,因为例如,我可以在validate运行后将字段设置回 null - 所以我看不到使用的方法这里是单一类型。
允许任何字段为undefined:
type Person = {
name: string,
age: number
}
type OptionalPerson = $Shape<Person>
Run Code Online (Sandbox Code Playgroud)
允许任何字段为null:
type Person = {
name: string,
age: number
}
type NullablePerson = $ObjMap<Person, <V>(V) => ?V>
Run Code Online (Sandbox Code Playgroud)
允许任何字段为undefined或null:
type Person = {
name: string,
age: number
}
type MaybePerson = $Shape<$ObjMap<Person, <V>(V) => ?V>>
Run Code Online (Sandbox Code Playgroud)
如果您需要经常使用此模式,您可以为自己创建一个可重用的实用程序类型。例如:
type Maybe<T> = $Shape<$ObjMap<T, <V>(V) => ?V>>
type Person = {
name: string,
age: number
}
type MaybePerson = Maybe<Person>
Run Code Online (Sandbox Code Playgroud)
参考:
$Shape:Flow 文档中未记录。您可以在这里阅读:http://sitr.us/2015/05/31/advanced-features-in-flow.html#shapet
$ObjMap: https: //flow.org/en/docs/types/utilities/#toc-objmap
| 归档时间: |
|
| 查看次数: |
295 次 |
| 最近记录: |