Angular 6共享库编译报错:模板使用私有成员提示仅类内可访问
解答:Angular 6库编译时私有成员模板访问报错问题
嘿,这个问题我之前升级Angular库的时候也踩过坑!别担心,这不是Angular的bug,而是官方库构建工具引入的严格规范导致的,本质上是在引导我们遵循更合理的Angular最佳实践。下面给你拆解清楚:
为什么库编译和应用编译表现不一样?
Angular 6官方的库CLI(底层基于ng-packagr)默认开启了严格的模板类型检查,这是因为库是要被其他项目依赖的,必须保证对外API的严谨性和可维护性。而普通Angular应用的编译配置中,默认的类型检查严格程度较低,所以你在应用里用私有属性/方法绑定模板不会报错,但在构建库时就会触发校验。
为什么之前用第三方库构建工具没问题?
你提到的那个第三方库构建工具,大概率没有启用Angular官方的严格模板校验规则,或者它的构建流程绕过了这一步校验,所以没暴露这个问题。但官方的库构建工具是完全遵循Angular团队的设计规范来实现的,目的是让库的代码更健壮,避免其他使用者遇到潜在的兼容性问题。
这其实是Angular推荐的最佳实践
Angular团队一直强调:模板中用到的组件属性和方法,应该声明为public(或者不写修饰符,TypeScript默认就是public)。原因很简单:
- 模板本质上是组件视图层的一部分,属于组件对外暴露的视图接口范畴
private修饰符的设计初衷是限制类内部的成员访问,模板访问私有成员本身就不符合面向对象的封装原则- 保持模板访问的成员为public,也能让代码更清晰,其他开发者一眼就能看出哪些成员是模板会用到的
怎么解决这个问题?
- 最直接的方案:把模板中用到的所有
private属性/方法的修饰符去掉,改成public或者直接省略(TypeScript默认public) - 如果想兼顾封装性:可以把私有逻辑封装到类内部的私有方法里,然后暴露一个公共的方法给模板调用;或者用getter来提供属性访问,比如:
这样模板绑定private _currentYear: number; get currentYear(): number { return this._currentYear; }currentYear即可,既保持了内部逻辑的封装,又遵循了规范。
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

