枚举标志序列化与解析问题:如何将整数转换为枚举标志?
TypeScript枚举标志的序列化与解析方案
核心原理
TypeScript数字枚举本质是数字值的别名,位标志枚举的组合值也是合法数字。因此只需完成字符串↔数字的转换,再通过类型断言让TypeScript识别为枚举类型,就能正常使用位运算判断。
步骤实现
1. 序列化(存储到Cookie/localStorage)
将枚举组合值转为数字,再转成字符串存储:
enum CookieOptions { None = 0, Necessary = 1 << 0, Analytical = 1 << 1, Marketing = 1 << 2, Parsonalisation = 1 << 3, All = ~(~0 << 4), } // 示例:选择Analytical和Marketing的组合 const selectedOpts = CookieOptions.Analytical | CookieOptions.Marketing; // 存入localStorage localStorage.setItem('cookieOpts', String(selectedOpts)); // 存入Cookie同理 document.cookie = `cookieOpts=${selectedOpts}; path=/`;
2. 解析(从存储读取)
将字符串转为数字,断言为枚举类型后即可正常使用位运算:
// 从localStorage读取并解析 const storedStr = localStorage.getItem('cookieOpts'); // 处理空值,默认返回None const cookieOpts = storedStr ? parseInt(storedStr, 10) as CookieOptions : CookieOptions.None; // 按位判断标志是否存在 if (cookieOpts & CookieOptions.Analytical) { // 执行分析类Cookie相关逻辑 } if (cookieOpts & CookieOptions.Marketing) { // 执行营销类Cookie相关逻辑 }
可选:严谨性验证
如果需要确保解析的值是合法的位组合,可以添加验证函数过滤无效值:
function isValidCookieOpts(value: number): value is CookieOptions { // 确保值是0到All之间的合法位组合 return (value & CookieOptions.All) === value; } // 带验证的解析流程 const storedStr = localStorage.getItem('cookieOpts'); let cookieOpts = CookieOptions.None; if (storedStr) { const num = parseInt(storedStr, 10); if (isValidCookieOpts(num)) { cookieOpts = num; } }
内容的提问来源于stack exchange,提问作者Shlizer
相关产品推荐
相关产品推荐

