在 TypeScript 中将字符串转换为枚举
Convert a String to Enum in TypeScript
将字符串转换为枚举:
- 用于
keyof typeof
将字符串转换为枚举类型。 - 使用括号表示法访问枚举中字符串的相应值。
索引.tsx
enum EmailStatus { Read, Unread, Draft, } // 👇️ String to enum const str: keyof typeof EmailStatus = 'Read'; console.log(EmailStatus[str]); // 👉️ 0 const enumToStr = EmailStatus[EmailStatus.Read]; console.log(enumToStr); // 👉️ "Read"
使用
keyof typeof
允许我们获得一个将所有 Enum 键表示为字符串的类型。
索引.tsx
enum EmailStatus { Read, Unread, Draft, } // 👇️ type T = "Read" | "Unread" | "Draft" type T = keyof typeof EmailStatus;
如果我们将字符串的类型设置为枚举的可能类型之一,如果不匹配,我们将得到一个错误。
索引.tsx
enum EmailStatus { Read, Unread, Draft, } // ⛔️ Error: Type "Test" is not assignable to type "Read" | "Unread" | "Draft" const str2: keyof typeof EmailStatus = 'Test'; console.log(EmailStatus[str2]); // 👉️ undefined
您可以使用括号表示法访问与枚举中的字符串对应的值。
索引.tsx
enum EmailStatus { Read, Unread, Draft, } // // ⛔️ Error: Type "Test" is not assignable to type "Read" | "Unread" | "Draft" const str2: keyof typeof EmailStatus = 'Read'; console.log(EmailStatus[str2]); // 👉️ 0
另一种方法是断言存储字符串的变量的类型为Enum
.
索引.tsx
enum EmailStatus { Read, Unread, Draft, } const str = 'Read'; const strEnum = str as unknown as EmailStatus; console.log(EmailStatus[strEnum]); // 👉️ 0
在上面的例子中,我们断言str
变量存储了一个类型为EmailStatus
.
这种方法不如 using 干净
keyof typeof
,应尽可能避免使用,因为它不能防止错误值。您可以将任何字符串转换为具有值EmailStatus
而不会出现错误。
索引.tsx
enum EmailStatus { Read, Unread, Draft, } const str = 'Test'; const strEnum = str as unknown as EmailStatus; console.log(EmailStatus[strEnum]); // 👉️ undefined
使用时情况并非如此keyof typeof
。
索引.tsx
enum EmailStatus { Read, Unread, Draft, } // ⛔️ Error: Type "Test" is not assignable to type "Read" | "Unread" | "Draft" const str: keyof typeof EmailStatus = 'Test';
TypeScript 足够聪明,可以注意到它Test
不是枚举中的键之一,并在输入错误时显示错误。