сокращение для функций-стрелок для имен свойств объектов - PullRequest
0 голосов
/ 04 мая 2018

когда у меня есть:

const foo = 1;

Я могу установить сокращение для имен свойств объекта

const bar = {foo}

то же самое, что и

const bar = {foo: foo} // bar will be {foo: 1}

есть ли сокращение, когда у меня есть const с функцией стрелки?

const foo = () => 1

Я должен установить это так, но это не круто

const bar = {foo: foo()}

Я хотел бы сделать это так или что-то, что короче

const bar = {foo()}  //bar should be {foo: 1} but this will fail

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Глядя на спецификации , для этого нет синтаксиса.

enter image description here

В вашем случае ObjectLiteral должно разрешить до { PropertDefinitionList }, что должно разрешиться до PropertyDefinition. Что может быть PropertyDefinition? 1014 *

Это не может быть IdentifierReference - это ваш первый пример: {f}.

CoverInitializedName тоже не подходит. Это было бы похоже на {f = AssignmentExpression}, где AssignmentExpression определено здесь .

PropertyName: AssignmentExpression - это обычный синтаксис: {f: 1}

MethodDefinition позволяет вам сделать {f(){ return 1; }};, но опять же это не то, что вы хотите.

Похоже, приговора нет.

0 голосов
/ 04 мая 2018

Симметрия уже есть. {foo} эквивалентно {foo: () => 1 }, то есть объекту, содержащему свойство foo, которое является функцией. Например. затем вы можете назвать это так, если хотите:

bar.foo();

Ваш запрос, кажется, для нового синтаксиса, который вместо этого вызывает foo и заполняет bar.foo результатом. Нет такого синтаксиса . Что если foo принимает аргументы? Что если foo является асинхронным (тогда вы захотите использовать await)? Как вы получили функции с тем же именем, что и у свойств? Без продемонстрированного варианта использования трудно увидеть какое-либо значение для оптимизации этого шаблона.

Короче не всегда лучше читается.

Если у вас есть набор функций, предназначенных для предоставления результатов для набора свойств с одинаковыми именами, вы, возможно, могли бы сконструировать что-то, используя помощник mapObject , например:

const mapObj = (o, f) => Object.assign({}, ...Object.keys(o).map(k => ({[k]: f(o[k])})));

const foo = () => 1;
const fum = () => 2;

let bar = mapObj({foo, fum}, f => f());

console.log(JSON.stringify(bar));
0 голосов
/ 04 мая 2018

Хорошо, я забыл, что есть также IIFE , возможный со стрелками.

так что, если вам нравится преимущество этого сокращения, вы можете сделать

const foo = (() => 1)()
const bar = {foo}

недостаток: вам нужен IIFE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...