【问题标题】:How to constrain a variable to be one of the types in an enum如何将变量约束为枚举中的一种类型
【发布时间】:2022-07-25 18:45:12
【问题描述】:

如何实现一个泛型类型,将变量的值限制为枚举中的任何类型?

enum SexTypes {
    Male,
    Female
}

这将是要实现的类型:

type TApplyEnumConstraint<T> ........

要实现这一点:

let sex: TApplyEnumConstraint<SexTypes> = "Male"  // ==> OK
let sex: TApplyEnumConstraint<SexTypes> = "Female"  // ==> OK
let sex: TApplyEnumConstraint<SexTypes> = "foo"  // ==> Error

【问题讨论】:

  • 你真的想要这里有一个枚举吗?通常你会使用枚举本身,let sex: SexTypes = ...。在这种情况下,type SexTypes = "Male" | "Female"; 可能更能满足您的需求?
  • Right 在这种情况下也是如此,但我想知道如何使用枚举。如果我想根据已经创建的枚举类型进行约束
  • 那你为什么不使用枚举let sex: SexTypes = SexTypes.Male?如果这是运行时数据,则无论如何类型都将被删除。
  • 我找到了一种将枚举转换为字符串联合类型的方法:type TSexTypes= keyof typeof Sextypes。使用这个,工作,但我想如果有一种方法可以将它转换为通用,所以我可以将任何枚举转换为它的类型键的字符串的联合

标签: typescript


【解决方案1】:

如 cmets 中所述,联合类型可能更适合:

type SexTypes = "Male" | "Female";

如果你想坚持你的枚举方法,你可以做的是 convert 使用字符串文字将你的枚举转换为联合类型。但是,您必须首先为此定义枚举值。

enum SexTypes {
  Male = "Male",
  Female = "Female"
}

const sex1: `${SexTypes}` = "Female";
const sex2: `${SexTypes}` = "Male";
const sex3: `${SexTypes}` = "foo";
//    ~~~~ -> Type '"foo"' is not assignable to type '"Male" | "Female"'.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-24
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多