在 TypeScript 中,为什么 Symbols for Privacy 会向消费者抛出错误?

In TypeScript, why are Symbols for Privacy throwing errors for Consumers?

我希望我的一些 class 领域和方法有一些隐私

在我的项目中 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)

我不同意。 _foofoo 对我来说感觉很私密。很长一段时间(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 签名