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
相关产品推荐
相关产品推荐

