TypeScript枚举赋值环境变量报错:string无法赋值给number类型
解决TypeScript枚举赋值环境变量时的类型错误
错误信息
Type 'string' is not assignable to type 'number' as required for computed enum member values.
问题场景
直接给枚举成员赋值字符串字面量可正常运行,但使用环境变量取值时触发上述错误,示例代码:
export enum MEMBER_SHIP { CC_FREEMIUM_SKU = process.env.EU_CC_FREEMIUM, //'500018126', CC_PREMIUM_SKU = '500019693' }
错误原因
- TypeScript字符串枚举的成员值仅支持字符串字面量、字符串枚举成员引用,动态获取的环境变量类型为
string | undefined,无法被TS识别为合法的字符串枚举值。 - 当枚举中存在动态计算的成员时,TS可能误将枚举推断为数字枚举,从而抛出“string不能赋值给number”的类型冲突错误。
解决方案
方案一:类型断言指定字面量类型
通过非空断言(确保环境变量已配置)和类型断言,将环境变量转为对应字符串字面量,让TS识别为合法的字符串枚举值:
export enum MEMBER_SHIP { CC_FREEMIUM_SKU = process.env.EU_CC_FREEMIUM! as '500018126', CC_PREMIUM_SKU = '500019693' }
方案二:用对象常量替代枚举(推荐)
若不需要枚举的反向映射特性,使用对象常量更灵活,能轻松兼容动态环境变量:
// 定义常量对象 export const MEMBER_SHIP = { CC_FREEMIUM_SKU: process.env.EU_CC_FREEMIUM! as string, CC_PREMIUM_SKU: '500019693' as const } as const; // 提取类型,实现类似枚举的类型约束 type MEMBER_SHIP = typeof MEMBER_SHIP[keyof typeof MEMBER_SHIP];
方案三:转为数字类型(若SKU为数字)
如果你的SKU本质是数字类型,可将环境变量转为数字后赋值:
export enum MEMBER_SHIP { CC_FREEMIUM_SKU = Number(process.env.EU_CC_FREEMIUM), CC_PREMIUM_SKU = 500019693 }
⚠️ 注意:需确保环境变量是有效数字,否则会得到NaN,建议添加前置校验逻辑。
内容的提问来源于stack exchange,提问作者Shehryar Tanoli
相关产品推荐
相关产品推荐

