В TypeScript, почему символы для конфиденциальности выдают ошибки для потребителей? - PullRequest
1 голос
/ 09 июня 2019

Я хочу немного приватности для некоторых полей и методов моего класса

  • я знаю, что символы не действительно приватны, но я просто не хочу "закрытые "члены", просто плавающие вокруг, чтобы люди могли их легко использовать, речь идет о сигнале намерения
  • ключевое слово "private" машинописного текста ничего не делает для обозначения намерения о конфиденциальности, ни добавляя префикс подчеркивания, ни используя символы(даже не в качестве опции)
  • я не хочу ждать, пока машинопись введет предложение # для приватных полей, и не переключиться на babel сейчас над этим

здесь, вмой проект удивительно я создал несколько классов, которые используют символы для доступа к закрытым членам

шаблон в основном:

const _counter = Symbol()

export class CountingThing {
  private [_counter] = 0
}

я подумал, что это хороший способреализовать конфиденциальность до тех пор, пока машинопись не будет, наконец, включать синтаксис частного поля # - это прекрасно работает для пользователей npm только для javascript

к сожалению, этот шаблон не 'Кажется, что он работает для машинописи потребителей моего пакета

моего потребителя проекта получает эти ошибки во время компиляции машинописи:

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 ]

2 голосов
/ 09 июня 2019

ни путем добавления префикса подчеркивания, ни с помощью символов (даже в качестве опции)

Я не согласен. _foo против foo кажется мне очень приватным. Это был образец в JavaScript долгое время (2007).

ключевое слово "private" машинописного текста ничего не говорит о намерении обеспечить конфиденциальность

Отлично работает для потребителей TypeScript. Потребители JavaScript знают о _, по крайней мере, если они используют любые другие чистые JS-проекты, которые компилируются до es5 (подавляющее большинство)

Мое предложение

private _something ??

0 голосов
/ 10 июня 2019

Другое решение заключается в экспорте каждого символа

const _counter = Symbol()

// the export keyword must be added

export const _counter = Symbol()

Это устраняет ошибки машинописи для потребителя

Однако оно увеличивает доступность этих символов, облегчая для потребителейиспользуйте их так, как они указаны в публичной подписи модуля

...