代码之家  ›  专栏  ›  技术社区  ›  ThomasReggi

从枚举值查找返回枚举

  •  0
  • ThomasReggi  · 技术社区  · 6 年前

    我有一个枚举 Animals 我正在尝试创建一个接受值的函数,如果该值有效,则整个枚举对象将该值作为EMUM返回。

    enum Animals {
      WOLF = 'wolf',
      BADGER = 'badger',
      CAT = 'cat',
     }
    
    const coerseEnum = <T> (s, E: T): T | undefined => {
      const keys = Object.keys(E);
      const values = keys.map(k => E[k as any]);
      const obj = lodash.zipObject(keys, values);
      const key = lodash.findKey(obj, item => item === s);
      if (!key) return undefined;
      return E[key];
    };
    
    const x: Animals | undefined = coerseEnum('cat', Animals);
    console.log(x);
    

    不过,它并没有铸造到 动物 但是 typeof Animals .

    1 回复  |  直到 6 年前
        1
  •  2
  •   Titian Cernicova-Dragomir    6 年前

    枚举具有枚举项的类型( Animal )同时也是对象的一种类型,它在运行时保存值。此对象也被命名为 动物 ,但它不是类型 动物 因为它包含枚举的所有条目。如果我们从枚举容器对象的类型开始( typeof Animal )要返回枚举的类型,我们需要编写 typeof Animal[keyof typeof Animal]

    在你的情况下, T 推断为 动物类型 ,枚举容器对象,因为这是传递给函数的内容。要返回枚举类型,我们需要执行以下操作 T[keyof T]

    enum Animals {
      WOLF = 'wolf',
      BADGER = 'badger',
      CAT = 'cat',
    }
    
    const coerseEnum = <T> (s: string, E: T): T[keyof T] | undefined => {
      const keys = Object.keys(E);
      const values = keys.map(k => E[k as any]);
      const obj = lodash.zipObject(keys, values);
      const key = lodash.findKey(obj, item => item === s);
      if (!key) return undefined;
      return E[key];
    };
    
    const x: Animals | undefined = coerseEnum('cat', Animals);
    console.log(x);
    

    注释 我们通常不会注意到这一点,但当我们使用 动物 在类型注释中,它是枚举项的类型,当我们使用 动物 作为一个值,我们讨论的是不属于类型的容器对象 动物 . 只是想澄清一下,以防上一段不完全清楚。