TypeScript/JavaScript中变量、类属性前缀#(哈希符号)的含义?
TypeScript与JavaScript中#前缀的含义
1. 核心定义:语言级私有字段
在ES2022(ES12)及后续的JavaScript标准,以及支持该特性的TypeScript版本中,前缀#用于声明真正的类私有字段/方法——这是语言层面强制执行的私有性,而非开发者之间的命名约定:
- 带
#的字段仅能在类的内部访问,类外部(包括子类)完全无法直接读取或修改,甚至无法通过obj['#field']这类方式绕过限制 - 这类私有字段不会被实例对象暴露,也不会被
Object.keys()、for...in等枚举方法遍历到
2. 示例代码解析
你给出的TypeScript代码里,#state和#store都是类的私有字段:
export class MyFacade { #state: MyState = { isLoading: true }; readonly #store = new BehaviorSubject<MyState>(this.#state); }
#state是MyFacade类的私有状态字段,仅能在类内部的方法中读写,外部代码执行myFacadeInstance.#state会直接报错readonly #store是只读私有字段,初始化后无法被重新赋值,同样只能在类内部访问和调用其方法
3. 和下划线命名的区别
- 下划线
_只是开发者的约定俗成,语言不限制外部访问,比如obj._privateField依然可以被外部读取或修改 #是语法层面的强制私有,从根本上杜绝了外部访问的可能,是真正意义上的私有成员
内容的提问来源于stack exchange,提问作者ymoreau
相关产品推荐
相关产品推荐

