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

标签 flowtype

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

例如,验证类型为 T 的对象时,在验证之前我知道我有一些看起来像 T 的东西但可能缺少某些字段。验证成功后,我知道我有一个 T并且每次使用它们时都不需要对所有字段进行 nullcheck。

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无需手动操作?

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

最佳答案

允许任何字段未定义:

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

type OptionalPerson = $Shape<Person>

flow.org/try


允许任何字段为null:

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

type NullablePerson = $ObjMap<Person, <V>(V) => ?V>

flow.org/try


允许任何字段为 undefinednull:

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

type MaybePerson = $Shape<$ObjMap<Person, <V>(V) => ?V>>

flow.org/try


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

type Maybe<T> = $Shape<$ObjMap<T, <V>(V) => ?V>>

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

type MaybePerson = Maybe<Person>

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

关于Flowtype:所有字段都为 Maybes 的类型的简写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50553149/

相关文章:

reactjs - flow - 对于使用 Flow 打字的 react router 的 history.push,我可以使用哪种类型?

javascript - 流无弱类型警告 : optional argument of weak type with default value

flowtype - 是否可以在 Node 中导出/导入流类型?

javascript - Flow : "?() => void" 这个问号是什么意思

javascript - Flowtype 未检测对象内部的属性类型

reactjs - 流量: How to type a HOC that accepts a prop the wrapped component doesn't care about

javascript -/* @flow strict */在所有源文件上

javascript - 流错误 : property is missing in . .. 但存在于

javascript - `Experimental decorator usage` 的流类型消除警告

javascript - 如何让 .flowconfig 从文件夹中读取类型?