Настройка констант через прокси

  • 14 марта, 14:12
  • 3835
  • 0

Рассмотрим настройку констант через прокси.

1. Простая версия

1.1 Перечисление TypeScript

В качестве примера рассмотрим следующее перечисление TypeScript (сам JavaScript не имеет перечислений):

enum MyEnum { foo, bar, baz }

assert.equal(MyEnum.foo, 0);
assert.equal(MyEnum.bar, 1);
assert.equal(MyEnum.baz, 2);

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

enum MyEnum { foo='foo', bar='bar', baz='baz' }

assert.equal(MyEnum.foo, 'foo');
assert.equal(MyEnum.bar, 'bar');
assert.equal(MyEnum.baz, 'baz');

1.2 Решения на чистом JavaScript

Вы можете достичь подобного с помощью JavaScript следующим образом:

const keyProxy = new Proxy({}, {
  get(_target, propKey, _receiver) {
    return propKey;
  }
});
const {foo, bar, baz} = keyProxy;

assert.equal(foo, 'foo');
assert.equal(bar, 'bar');
assert.equal(baz, 'baz');

Как это работает? Мы объединяем два ингредиента.

Во-первых, прокси - объект, где какой бы ключ для чтения свойства вы не использовали, вы всегда будете получать ключ как значение:

assert.equal(keyProxy.hello, 'hello');
assert.equal(keyProxy.world, 'world');

Во-вторых, использование сокращенного присвоения свойства значение при деструктуризации позволяет нам указать ключ свойства и имя переменной в то же время. То есть, два следующих объявления эквивалентны:

const {foo, bar, baz} = keyProxy;
const {foo: foo, bar: bar, baz: baz} = keyProxy;

2. Символы как значение для констант

Если вы используете символы как значение для констант, то получаете больше типобезопасность. Единственная строка прокси, которая изменилась - строка A.

const keyProxy = new Proxy({}, {
  get(_target, propKey, _receiver) {
    return Symbol(propKey); // (A)
  }
});
const {foo, bar, baz} = keyProxy;

assert.equal(typeof foo, 'symbol');
assert.equal(String(foo), 'Symbol(foo)');


Теги: javascript
Banner
0 комментариев
Сортировка:
Добавить комментарий