TypeScript疑问:此场景下为何需要使用get访问器?
为什么AuthService中的
tokenValid要使用get访问器? 嘿,我来帮你理清这个问题!首先要纠正一个常见的误解:get访问器完全不需要和setter配对使用,它的核心作用远不止封装私有成员的读取——很多时候它是用来定义动态计算的只读属性的。
你的原有理解 vs 实际场景的区别
你之前举的例子是用get/set封装私有变量,限制对myNum的直接修改,这是get/set的一种用法,但不是唯一用法。而Auth0教程里的tokenValid属于另一种场景:它是一个计算属性,每次访问它时都会动态计算出当前token是否有效,而不是返回一个预先存储的固定值。
为什么这里用get而不是普通方法?
结合Auth0的常见逻辑推断,tokenValid的实际实现大概是这样的:
get tokenValid() { const token = localStorage.getItem('access_token'); if (!token) return false; // 解析token并检查过期时间 const payload = JSON.parse(atob(token.split('.')[1])); return payload.exp * 1000 > Date.now(); }
用get访问器的好处很明显:
- 语法更简洁:你可以像访问属性一样写
if (this.tokenValid),而不是if (this.checkTokenValid()),代码可读性更强。 - 语义更准确:
tokenValid表达的是当前的一种状态,而不是一个动作,用属性访问的方式更符合语义,方法调用会让人感觉是在执行一个操作。 - 自动更新状态:每次访问
tokenValid都会重新计算结果,确保拿到的是最新状态(比如token过期后,下次访问就会返回false)。
什么时候不需要setter?
当这个属性的值是由其他状态派生出来的,不需要也不应该被直接设置时,就完全不需要setter。比如:
- 一个
User类的isAdultgetter,根据birthDate计算是否成年,你不能直接设置isAdult = true,只能通过修改生日来改变这个状态。 - 这里的
tokenValid也是同理,它由localStorage里的token和当前时间决定,你无法直接设置this.tokenValid = true,只能通过登录获取新token或者登出删除token来改变它的结果。
所以回到你的AuthService代码,这个tokenValid getter的作用就是让你可以方便、直观地检查当前用户的Auth0 token是否有效,完全不需要对应的setter~
内容的提问来源于stack exchange,提问作者james keller
相关产品推荐
相关产品推荐

