如何将类型键用作枚举?
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后存在的东西。
例如我有
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后存在的东西。