You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flow如何实现将对象可选键对应值转为可选类型工具

优化实现方案

你原来使用$ObjMapi的实现逻辑是正确的,下面提供的方案在类型推导性能、版本兼容性上做了优化,也更易维护:

核心工具类型实现

// 提取对象的所有可选键,兼容Flow 0.130及以上版本
type OptionalKeys<T> = $Keys<$ObjMapi<T, <K, V>(K, V) => void | T[K] extends V ? never : K>>

// 目标转换工具:可选键的属性值自动追加可空标记,必选键保持原类型不变
type MarkOptionalPropsNullable<T> = {
  ...$Exact<T>,
  [K in OptionalKeys<T>]?: ?$ElementType<T, K>
}

使用示例

// 原始类型
type o = {
  a?: string,
  b: string
}

// 转换后类型
type transformedO = MarkOptionalPropsNullable<o>
// 等价于你需要的输出:
// type transformedO = {
//   a?: ?string,
//   b: string
// }

进一步优化建议

  • 如果你项目使用Flow 0.180及以上版本,可以直接使用Flow内置的$OptionalKeys工具替换上面自定义的OptionalKeys,代码更精简:
    type MarkOptionalPropsNullable<T> = {
      ...$Exact<T>,
      [K in $OptionalKeys<T>]?: ?$ElementType<T, K>
    }
    
  • 如果要避免重复给已经是可空类型的属性追加可空标记,可以在转换时新增去可空逻辑:
    type MarkOptionalPropsNullable<T> = {
      ...$Exact<T>,
      [K in OptionalKeys<T>]?: ?$NonMaybeType<$ElementType<T, K>>
    }
    
  • 如果需要转换后的类型保持精确对象约束,直接给结果套上$Exact<>即可:type ExactTransformed = $Exact<MarkOptionalPropsNullable<o>>

内容的提问来源于stack exchange,提问作者ᴘᴀɴᴀʏɪᴏᴛɪs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:06:05