【问题标题】:How can I use a property key (object.key) in a TypeScript Enum?如何在 TypeScript 枚举中使用属性键 (object.key)?
【发布时间】:2023-04-04 22:42:01
【问题描述】:

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

我知道我能做到:

export enum FRUIT {
  PEACH,
  BANANA
}

但在这种情况下,'FRUITS' 是从单独的文件中导出的,格式如下:

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

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

我需要做的:

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

但是这是一个语法错误:

只有数字枚举可以有计算成员,但这个表达式的类型是“字符串”。如果您不需要详尽检查,请考虑改用对象字面量。

我如何在 TypeScript 枚举中使用属性键 (object.key)? 或者,如果我不能,我该如何解决语法错误?

【问题讨论】:

  • 什么FRUITS?您似乎正在尝试将其中的 values 用作 names,这没有多大意义 - 你想要例如export enum FRUIT_TYPES { PEACH = FRUIT.PEACH, ... }?或者也许是你只能使用的东西,例如keyof typeof FRUITS(如"PEACH")作为值?一旦你创建了它,你将如何使用它?
  • edit问题包含此信息。
  • 那组字符串是keyof typeof FRUIT吗?请将其放在问题中,并附上一个示例,说明您打算如何使用它。
  • 在操场上试试 - type FRUIT_NAMES = keyof typeof FRUIT 将是 "PEACH" | "BANANA" | "PEAR"
  • 那么是的,您可能想要一个带有Pick(“只有桃子或香蕉”)或Omit(“不是梨”)的“valueof” - 请参阅typescriptlang.org/docs/handbook/utility-types.html。不过,这不会让你进入枚举。

标签: typescript enums


【解决方案1】:

这不会为您提供枚举,但如果您的目标只是能够表达FRUIT.PEACHFRUIT.BANANA,则不需要枚举。

  • 首先,您需要比string 更具体地键入FRUIT 的值,这可以使用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”类型,如jcalzIs there a `valueof` similar to `keyof` in TypeScript? 的回答所示:

    type ValueOf<T> = T[keyof T];
    
  • 最后你可以使用PickOmitutility typestypeof FRUIT中选择你想要包含的道具:

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

Playground

【讨论】:

  • 只是想承认你早些时候说这是一个 y/x 问题时是对的。我认为枚举是在这种情况下限制值的唯一方法,但显然不是。
猜你喜欢
  • 2022-09-23
  • 2020-08-09
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
相关资源
最近更新 更多