如何为只读属性赋值?遇USER_KEY只读常量赋值报错问题求助
解决USER_KEY只读报错的问题
你遇到的报错核心原因很明确:你用const声明了导出的USER_KEY变量,而const定义的变量是不可重新赋值的,所以在userKey函数里尝试给它赋值时,必然会抛出"Assignment to constant variable"的错误。
下面给你两种可行的解决方案,按需选择:
方案一:改用let声明可变变量
直接把const换成let,让USER_KEY变成可重新赋值的变量,这样你的赋值逻辑就能正常工作:
// 用let替代const,允许重新赋值 export let USER_KEY = ''; // 重命名函数更语义化,比如叫setUserKey export const setUserKey = (user_id) => { USER_KEY = user_id; }; export const onSignIn = () => AsyncStorage.setItem(USER_KEY, 'true'); export const onSignOut = () => AsyncStorage.removeItem(USER_KEY);
使用时记得先调用setUserKey(user_id),再执行onSignIn或onSignOut,否则会用空字符串作为操作AsyncStorage的key。
方案二:用闭包封装(更安全的做法)
如果不想暴露可变的全局变量给外部模块,推荐用闭包内部维护userKey,只对外暴露设置和操作的方法,避免意外修改:
// 内部维护的私有变量,外部无法直接修改 let _userKey = ''; export const setUserKey = (user_id) => { _userKey = user_id; }; export const onSignIn = () => { // 增加校验,防止未设置key就执行操作 if (!_userKey) { throw new Error('请先调用setUserKey设置用户ID'); } return AsyncStorage.setItem(_userKey, 'true'); }; export const onSignOut = () => { if (!_userKey) { throw new Error('请先调用setUserKey设置用户ID'); } return AsyncStorage.removeItem(_userKey); }; // 可选:如果外部需要获取当前key,暴露一个获取方法 export const getUserKey = () => _userKey;
这种方式的优势是能避免外部模块意外修改userKey的值,同时增加了校验逻辑,防止因未设置key导致的存储操作异常。
内容的提问来源于stack exchange,提问作者Markus Hayner
相关产品推荐
相关产品推荐

