在TypeScript中,为什么隐私符号会向消费者抛出错误?

时间:2019-06-09 18:55:37

标签: typescript symbols privacy

我希望为某些班级字段和方法提供一些隐私

  • 我知道符号不是真的不是真的,但是我只是不想让“私人”成员随处可见,以便人们轻松使用,这是在传达意图
  • 打字稿的“ private”关键字并没有通过添加下划线前缀或使用符号(甚至不作为选项)来暗示隐私意图
  • 我不想等待打字稿实施私有字段#提案,也不想现在就切换到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文件的使用者

如今在打字稿中有哪些策略可以实现某种程度的隐私保护?

2 个答案:

答案 0 :(得分:2)

  

既不添加下划线前缀也不使用符号(甚至不作为选项)

我不同意。 _foofoo对我来说非常私密。长期以来,它一直是JavaScript的模式(2007年)。

  

打字稿的“私人”关键字没有任何暗示隐私意图的事情,

它对TypeScript使用者有效。 JavaScript使用者至少_知道private _something,如果他们使用编译到es5(绝大多数)的任何其他纯JS项目

我的建议

idxmin??

答案 1 :(得分:0)

另一种解决方案是导出每个符号

const _counter = Symbol()

// the export keyword must be added

export const _counter = Symbol()

这为使用者解决了打字稿错误

但是,确实增加了这些符号的可用性,使消费者更容易使用出现在模块公共签名中的符号