如何将类型键用作枚举?

How can I use type key as enum?

例如我有

type typeA = "A1" | "A2" | "A3";

那我要用类型值方向

typeA.A1; // "A1"

可能吗?

正如我在评论中所说,由于 type erasure,您不能将类型别名用作枚举。 typeA 将不存在于生成的 Javascript 中,因此在运行时不存在。[1]

既然您在评论中说 typeA“由第 3 方维护”,您也无能为力。但也有你不需要做的事情:

  • 当你可以写 "A1" 时,你为什么要在你的代码中写 typeA.A1?这几乎就像在代码中定义 const TWO = 2 并使用 TWO 而不是文字 2.
  • 使用 typeA.A 而不是 "A1" 没有额外的类型安全。静态类型检查将阻止您 assigning/passing 将 typeA 允许的值以外的任何值赋给具有该类型的任何变量或参数。
  • 任何支持 Typescript 的 IDE 都会自动建议此类变量和参数的合法值。

但假设你真的 needed/wanted 能够说 typeA.A1...

代码必须以相反的方式工作:定义枚举值(不一定使用 enum 语法),然后定义表示这些值的并集的类型别名。

例如:

enum A {A1 = "A1", A2 = "A2", A3 = "A3" }

// type typeA = "A1" | "A2" | "A3"
type typeA = keyof typeof A

用法:

function checkA(arg: typeA):void {
    console.log(arg)
}

checkA(A.A1)  //ok
checkA("A1")  //ok
checkA("A4")  //error

let v1: A = A.A1
let v2: typeA = "A1"
let v3: string = "A1"

checkA(v1)    //ok
checkA(v2)    //ok
checkA(v3)    //error

您可以将函数 arg 定义为 arg: A,但它会更加严格,只接受对 A 枚举的引用,而不是字符串 "A1" 或变量v2:

function checkA(arg: A):void {
    console.log(arg)
}

您必须说服第三方进行此更改。


[1] 有a nice table in the Typescript docs总结了转译成Javascript后存在的东西。