我希望为某些班级字段和方法提供一些隐私
#
提案,也不想现在就切换到babel 在我的项目quizzly中,我创建了一些使用符号访问私有成员的类
模式基本上是:
const _counter = Symbol()
export class CountingThing {
private [_counter] = 0
}
我认为这是实现隐私的一种好方法,直到打字稿最终结合了#
私有字段语法-这对于仅使用JavaScript的npm消费者来说效果很好
不幸的是,这种模式似乎不适用于我的包裹的 typescript 使用者
我的 消费者 项目在打字稿编译过程中遇到以下错误:
node_modules/quizzly/dist/components/quizzly-question.d.ts:8:13 - error TS1166: A computed property name in a class property declaration must refer to an expression whose type is a literal type or a 'unique symbol' type.
8 private [_getChoices];
~~~~~~~~~~~~~
node_modules/quizzly/dist/components/quizzly-question.d.ts:8:14 - error TS2304: Cannot find name '_getChoices'.
8 private [_getChoices];
~~~~~~~~~~~
node_modules/quizzly/dist/components/quizzly-quiz.d.ts:26:13 - error TS1166: A computed property name in a class property declaration must refer to an expression whose type is a literal type or a 'unique symbol' type.
26 private [_getSlottedElements];
~~~~~~~~~~~~~~~~~~~~~
node_modules/quizzly/dist/components/quizzly-quiz.d.ts:26:14 - error TS2304: Cannot find name '_getSlottedElements'.
26 private [_getSlottedElements];
但是,为什么消费者会抱怨私有变量,而消费者甚至根本不了解这些变量?
奇怪的是,测验项目本身在打字稿编译期间未报告任何错误,这仅影响使用.d.ts
文件的使用者
如今在打字稿中有哪些策略可以实现某种程度的隐私保护?
答案 0 :(得分:2)
既不添加下划线前缀也不使用符号(甚至不作为选项)
我不同意。 _foo
和foo
对我来说非常私密。长期以来,它一直是JavaScript的模式(2007年)。
打字稿的“私人”关键字没有任何暗示隐私意图的事情,
它对TypeScript使用者有效。 JavaScript使用者至少_
知道private _something
,如果他们使用编译到es5(绝大多数)的任何其他纯JS项目
idxmin
??
答案 1 :(得分:0)
另一种解决方案是导出每个符号
const _counter = Symbol()
// the export keyword must be added
export const _counter = Symbol()
这为使用者解决了打字稿错误
但是,确实增加了这些符号的可用性,使消费者更容易使用出现在模块公共签名中的符号