Flowtype:所有字段为Maybes的类型的简写

时间:2018-05-27 14:27:37

标签: flowtype

使用Flow,有时我想表示某种类型的对象,但任何字段可能是undefinednull

例如,在验证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

我的问题:

  1. 在Flow中是否有某种简写,例如$WithAllFieldsMaybe<T>,所以我可以从MaybeT派生T而无需手动执行此操作?< / p>

  2. 如果没有,是否有更好的模式,而不需要使用两种不同的类型?据我所知,没有办法让Flow'知道'validate之后所有字段都存在,因为,例如,我可以在validate运行后将字段设置为空 - 所以我在这里看不到使用单一类型的方法。

1 个答案:

答案 0 :(得分:3)

允许任何字段为type Person = { name: string, age: number } type OptionalPerson = $Shape<Person>

null

flow.org/try

允许任何字段为type Person = { name: string, age: number } type NullablePerson = $ObjMap<Person, <V>() => ?V>

undefined

flow.org/try

允许任何字段为nulltype 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>

flow.org/try

如果您需要经常使用此模式,可以为自己创建可重用的实用程序类型。例如:

$Shape

flow.org/try

参考文献:

$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