【问题标题】:Handling Enums with FlowType使用 FlowType 处理枚举
【发布时间】:2017-09-10 16:41:21
【问题描述】:
export type Size =
| 'small'
| 'medium'
| 'large'
| 'big'
| 'huge';

像这样定义 Size 类型可以让我在我的 IDE 中自动完成,无论我在哪里使用它:

然而,我还想在组件内部使用这些值:假设是一个带有可用大小值的下拉菜单。

为了实现这一点,我正在维护一个 sizes 对象,我可以利用 $Keys 从中提取 Size FlowType:

export const sizes = {
  small: 'small',
  medium: 'medium',
  large: 'large',
  big: 'big',
  huge: 'huge',
};

export type Size = $Keys<typeof sizes>;

它的工作原理在于它指出了道具的无效值:

然而,这个解决方案是有代价的:它搞砸了我所有的自动完成功能...:(有更好的方法来处理 FlowType 中的枚举吗?

【问题讨论】:

    标签: enums flowtype


    【解决方案1】:

    这是$Keys的巧妙用法!

    我不知道从对象派生Size 类型的更好方法。也许你可以像这样朝另一个方向工作:

    export type Size =
    | 'small'
    | 'medium'
    | 'large'
    | 'big'
    | 'huge';
    
    export const sizes: { [key: string]: Size } = {
      small: 'small',
      medium: 'medium',
      large: 'large',
      big: 'big',
      huge: 'huge',
    };
    

    或者这样可以消除一些重复:

    export const sizes: { [key: string]: Size } = [
      'small',
      'medium',
      'large',
      'big',
      'huge'
    ].reduce((obj, s) => {
      obj[s] = s
      return obj
    }, {})
    

    显然,它使用了更多样板。但是使用sizes 上的类型约束,您至少可以检查以防止无效字符串进入sizes 对象。

    【讨论】:

    • 我需要考虑一下,抱歉。但是,是的,我同意这是解决这个问题的一种非常巧妙的方法。正是我想要的。谢谢(虽然我更喜欢第一种方法,但第二种方法太神秘了,需要花费大量精力才能在我的大脑中快速解析它以快速了解实际发生的情况)
    • @jessie-hallett 这很好用,但不幸的是,如果我这样注释我的对象,像 vscode 和 atom 这样的编辑器会失去对象上存在的属性的自动完成功能。有没有办法解决这个问题?
    • 我为自动完成问题提交了一张票,如果你想跟进看看 :) github.com/facebook/flow/issues/5431
    猜你喜欢
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多