Рассмотрим настройку констант через прокси.
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)');
0 комментариев
Добавить комментарий