如何将PropTypes.oneOf(Object.values(常量))转换为Typescript类型
解决方案
你可以基于TS的类型查询和索引访问能力,直接从已有的常量对象推导值的联合类型,写法如下:
type Props = { placement: typeof TOOLTIP_PLACEMENTS[keyof typeof TOOLTIP_PLACEMENTS] }
代码逻辑说明
- 先用
typeof TOOLTIP_PLACEMENTS获取常量对象本身的TS类型,由于你用了Object.freeze冻结对象,TS会自动把属性值推导为精确的字符串字面量类型,而不是宽泛的string类型 - 再用
keyof typeof TOOLTIP_PLACEMENTS获取该对象所有键的联合类型,也就是'TOP' | 'BOTTOM' | 'LEFT' | 'RIGHT' - 最后通过索引访问的方式,拿到所有键对应的值的联合类型,最终推导结果为
'top' | 'bottom' | 'left' | 'right',和你原有PropTypes定义的校验规则完全匹配
如果需要在多处使用这个放置位置类型,可以单独抽离定义:
type TooltipPlacement = typeof TOOLTIP_PLACEMENTS[keyof typeof TOOLTIP_PLACEMENTS] type Props = { placement: TooltipPlacement }
这种写法的优势是后续你修改TOOLTIP_PLACEMENTS的常量值时,对应的类型会自动同步更新,不需要手动维护类型定义,完全避免硬编码字符串字面量的冗余问题。
内容的提问来源于stack exchange,提问作者bigpotato
相关产品推荐
相关产品推荐

