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

如何在TypeScript枚举中使用属性键(object.key)?

  •  -1
  • mikemaccana  · 技术社区  · 5 年前

    我想把一些JS数组转换成 TypeScript enums

    export enum FRUIT {
      PEACH,
      BANANA
    }
    

    但在本例中,“水果”是从单独的文件导出的,其格式为:

    const FRUIT = {
      PEACH: "delicious peach",
      BANANA: "wow a banana that's awesome",
      PEAR: "gross pear do not allow pear using the Enum"
    };
    

    (我想确保只有一部分水果,例如“美味桃子”可以设置为可接受的水果)

    我需要做:

    export enum ACCEPTABLE_FRUIT {
      FRUITS.PEACH,
      FRUITS.BANANA
    }
    

    但是,这是一个语法错误:

    只有数值枚举可以有计算成员,但此表达式的类型为“string”。如果不需要穷举检查,请考虑使用对象文字。

    或者,如果我不能,我如何才能绕过语法错误?

    0 回复  |  直到 5 年前
        1
  •  2
  •   jonrsharpe    5 年前

    这并不能为您提供枚举,但如果您的目标只是能够表达 FRUIT.PEACH 或 FRUIT.BANANA " 你不需要。

    • 首先,您需要 FRUIT string ,你可以用它 as const (见 literal inference ):

      const FRUIT = {
        PEACH: "delicious peach",
        BANANA: "wow a banana that's awesome",
        PEAR: "gross pear do not allow pear using the Enum"
      } as const;
      
    • 其次,您需要一个“valueof”类型,如中所示 jcalz 对的回答 Is there a `valueof` similar to `keyof` in TypeScript? :

      type ValueOf<T> = T[keyof T];
      
    • 最后,您可以使用 Pick 或 Omit utility types typeof FRUIT 您希望包括:

      type ACCEPTABLE_FRUIT = ValueOf<Pick<typeof FRUIT, "PEACH" | "BANANA">>;
      // type ACCEPTABLE_FRUIT = "delicious peach" | "wow a banana that's awesome";
      

    Playground