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)');
Ще немає коментарів