TypeScript与Angular中类静态字段未定义及静态成员行为差异问询
解决TypeScript/Angular中静态字段访问返回undefined的问题
嘿,我来帮你搞定这个问题!你遇到的情况其实是因为静态字段的声明和初始化没做好,和静态方法/getter的行为差异不大,咱们一步步理清楚:
问题根源
你在SystemColors类里的static _gray只是声明了这个静态成员,但没有给它赋值——TypeScript里如果只声明变量不初始化,它的默认值就是undefined。
而static get gray()是一个静态访问器(getter),每次你调用SystemColors.gray的时候,都会执行getter里的代码,返回你定义好的颜色对象,所以能正常拿到值。
解决方案
只需要给静态字段_gray加上初始化赋值就行了,修改你的colors.ts代码:
export class SystemColors { // 给_gray添加初始化赋值,同时可以加上类型定义(可选但推荐) static _gray: { default: string, darker: string[], lighter: string[] } = { default: '#ABAFBE', darker: ['#7C8298', '#606473'], lighter: ['#C8D1DA', '#E2E3ED', '#F5F6FA'] }; public static get gray() { return { default: '#ABAFBE', darker: ['#7C8298', '#606473'], lighter: ['#C8D1DA', '#E2E3ED', '#F5F6FA'] }; } }
现在你再访问SystemColors._gray,就能拿到预期的颜色对象了。
优化建议(可选)
如果_gray只是作为内部数据,不想让外部直接修改,建议把它改成私有静态字段,然后让getter返回它——这样既封装了数据,又避免了每次调用getter都创建新对象的开销:
export class SystemColors { // 用private修饰,外部无法直接访问 private static _gray = { default: '#ABAFBE', darker: ['#7C8298', '#606473'], lighter: ['#C8D1DA', '#E2E3ED', '#F5F6FA'] }; public static get gray() { // 返回内部的静态字段,复用同一个对象 return this._gray; } }
这样外部只能通过SystemColors.gray访问颜色数据,不能直接修改_gray,更符合面向对象的封装原则。
内容的提问来源于stack exchange,提问作者yael kfir
相关产品推荐
相关产品推荐

