Налаштування констант через проксі

1 хв. читання

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)');
Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 5.8K
Приєднався: 8 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація