TypeScript私有属性命名最佳实践及是否需设置get/set方法
TypeScript私有属性命名最佳实践与get/set方法的使用建议
嘿,我来聊聊这个问题——毕竟在TypeScript里处理私有属性确实容易纠结,尤其是看了官方编码指南之后,很容易对之前的习惯产生疑问。先拆解成两部分来说:
一、私有属性的命名最佳实践
TypeScript里其实有两种“私有”属性的实现方式,对应的命名习惯也不一样:
- 使用
private修饰符(编译时私有):这种方式在编译后的JavaScript代码里,属性其实还是可以被外部访问的(毕竟早期JS没有真正的私有字段)。官方指南和社区的通用做法是给这类属性加上下划线前缀_,比如_userName。这么做的核心是视觉标识,让所有开发者一眼就能认出这是个内部私有属性,不要直接去修改它,即使技术上能做到。 - 使用
#前缀的真正私有字段(运行时私有):这是ES6+标准的私有字段,运行时完全无法从外部访问。这种情况下就不需要再加下划线了,直接用#userName就行——#本身已经是明确的私有标识,再加下划线反而画蛇添足。
最重要的一点是:团队内部要保持一致性。不管选哪种风格,全团队统一执行,比纠结“哪种更正确”要重要得多。
二、是否要统一给私有属性加get/set方法?
答案是:完全没必要统一,按需使用就好。分几种场景来看:
- 需要控制访问逻辑时,必须加:如果私有属性需要对外暴露,但你要限制它的读取或修改行为——比如修改时要做参数验证、格式转换,或者读取时要返回计算后的值,那get/set就是刚需。举个例子:
class Product { private _price: number; get price(): number { // 返回时加上税 return this._price * 1.13; } set price(value: number) { // 验证价格不能为负数 if (value < 0) throw new Error("价格不能为负数"); this._price = value; } } - 仅内部使用的私有属性,别加:如果某个属性只是类内部逻辑用,完全不需要对外暴露,加get/set纯粹是增加冗余代码,毫无意义。
- 需要只读暴露时,只加get方法:如果想让外部能读取属性,但不能修改,只写get方法就够了。比如用真正私有字段的场景:
这样外部只能读id,没法修改,比用公共属性更安全。class User { #id: string; get id(): string { return this.#id; } constructor(id: string) { this.#id = id; } }
最后想说,官方的编码指南是参考而非强制规范,适合大部分场景,但团队可以根据自己的业务和习惯调整。核心始终是代码的可读性、可维护性,以及团队协作的顺畅性。
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

