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

dav*_*wil 2 flowtype

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

例如,当验证 类型的对象时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

我的问题:

  1. Flow 中是否有某种简写形式,即类似 的东西$WithAllFieldsMaybe<T>,这样我就可以MaybeT从中派生T而无需手动执行?

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

saa*_*adq 6

允许任何字段为undefined

type Person = {
  name: string,
  age: number
}

type OptionalPerson = $Shape<Person>
Run Code Online (Sandbox Code Playgroud)

flow.org/try


允许任何字段为null

type Person = {
  name: string,
  age: number
}

type NullablePerson = $ObjMap<Person, <V>(V) => ?V>
Run Code Online (Sandbox Code Playgroud)

flow.org/try


允许任何字段为undefinednull

type Person = {
  name: string,
  age: number
}

type MaybePerson = $Shape<$ObjMap<Person, <V>(V) => ?V>>
Run Code Online (Sandbox Code Playgroud)

flow.org/try


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

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)

flow.org/try


参考:

$Shape:Flow 文档中未记录。您可以在这里阅读:http://sitr.us/2015/05/31/advanced-features-in-flow.html#shapet

$ObjMap: https: //flow.org/en/docs/types/utilities/#toc-objmap

  • `$ObjMap` 似乎没有按预期工作[尝试](https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoVAXAngBwKZgAKeATgM5wB2YAvGAN6phiUCGAtngFxhkYkBLSgHMANEzCth3FgFd2AI1KoAvumz4wAWVZYlxclVpgAJAHkFAKx04AP AYqVRYWwDUAFAAoAlLXdgAfg8AbglUKFlKAGMMASMcQUOMBypPfENKHh09PBTKX0ZmdMcAOjZOY35ZPGCwYGAwBTg4GDxWaiE+NoATMDgoXn4hYVUGA) (2认同)