在 TypeScript 中,为什么 Symbols for Privacy 会向消费者抛出错误?
In TypeScript, why are Symbols for Privacy throwing errors for Consumers?
我希望我的一些 class 领域和方法有一些隐私
- 我知道符号不是 真的 私有的,但我只是不希望 "private" 成员四处游荡以供人们轻松使用,这是关于信号意图
- 打字稿 "private" 关键字不会通过添加下划线前缀或使用符号(甚至不作为选项)来表示隐私意图
- 我不想等待 typescript 实现私有字段
#
提案,也不想现在切换到 babel
在我的项目中 quizzly 我创建了一些 class 使用符号访问私有成员的元素
模式基本上是:
const _counter = Symbol()
export class CountingThing {
private [_counter] = 0
}
我认为这是实现隐私的好方法,直到 typescript 最终合并了 #
私有字段语法——这非常适合 javascript-only npm 消费者
不幸的是,这种模式似乎不适用于 typescript 我的包的消费者
我的 consumer 项目在 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];
但是为什么消费者会抱怨 私有 变量,而消费者根本不应该知道这些变量?
奇怪的是,quizzly 项目本身在 typescript 编译期间没有报告任何错误,这只会影响使用 .d.ts
文件的消费者
今天的打字稿有哪些策略可以实现某种隐私保护?
neither by adding an underscore prefix nor by using symbols (not even as an option)
我不同意。 _foo
与 foo
对我来说感觉很私密。很长一段时间(2007 年),它一直是 JavaScript 中的一种模式。
the typescript "private" keyword doesn't do anything to signal intent for privacy,
它适用于 TypeScript 消费者。 JavaScript 消费者知道 _
,至少如果他们使用任何其他编译为 es5 的纯 JS 项目(绝大多数)
我的建议
private _something
另一个解决方案是导出每个交易品种
const _counter = Symbol()
// the export keyword must be added
export const _counter = Symbol()
这解决了消费者的打字稿错误
但是,它确实增加了这些符号的可用性,使消费者更容易使用它们,因为它们出现在模块的 public 签名
我希望我的一些 class 领域和方法有一些隐私
- 我知道符号不是 真的 私有的,但我只是不希望 "private" 成员四处游荡以供人们轻松使用,这是关于信号意图
- 打字稿 "private" 关键字不会通过添加下划线前缀或使用符号(甚至不作为选项)来表示隐私意图
- 我不想等待 typescript 实现私有字段
#
提案,也不想现在切换到 babel
在我的项目中 quizzly 我创建了一些 class 使用符号访问私有成员的元素
模式基本上是:
const _counter = Symbol()
export class CountingThing {
private [_counter] = 0
}
我认为这是实现隐私的好方法,直到 typescript 最终合并了 #
私有字段语法——这非常适合 javascript-only npm 消费者
不幸的是,这种模式似乎不适用于 typescript 我的包的消费者
我的 consumer 项目在 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];
但是为什么消费者会抱怨 私有 变量,而消费者根本不应该知道这些变量?
奇怪的是,quizzly 项目本身在 typescript 编译期间没有报告任何错误,这只会影响使用 .d.ts
文件的消费者
今天的打字稿有哪些策略可以实现某种隐私保护?
neither by adding an underscore prefix nor by using symbols (not even as an option)
我不同意。 _foo
与 foo
对我来说感觉很私密。很长一段时间(2007 年),它一直是 JavaScript 中的一种模式。
the typescript "private" keyword doesn't do anything to signal intent for privacy,
它适用于 TypeScript 消费者。 JavaScript 消费者知道 _
,至少如果他们使用任何其他编译为 es5 的纯 JS 项目(绝大多数)
我的建议
private _something
另一个解决方案是导出每个交易品种
const _counter = Symbol()
// the export keyword must be added
export const _counter = Symbol()
这解决了消费者的打字稿错误
但是,它确实增加了这些符号的可用性,使消费者更容易使用它们,因为它们出现在模块的 public 签名