Переименование оставшейся переменной свойства при разрушении объекта в TypeScript

РЕДАКТИРОВАТЬ:

Я открыл проблему, связанную с этим на github: https://github.com/Microsoft/TypeScript/issues/21265
Кажется, что { ...other: xother } Не действует JS, ни TS, ни код, и его даже не нужно компилировать.

Оригинальный вопрос:

Давайте предположим следующий пример:

const values = { a: "1", b: "2", c: "3", d: "4" };
const { a: va, b: vb, ...other } = values;

где имя новой переменной va назначен на имущество a,

Допустимо ли в соответствии со спецификациями TypeScript делать то же самое с оставшимися свойствами ...other? Что-то вроде:

const { a: va, b: vb, ...other: vother } = values;

Я знаю, что это работает, я проверял это ( онлайн тест). Но я не могу найти, где это определено, чтобы сделать это.

В примерах документов, относящихся к переименованию свойств, всегда показан "нормальный" случай: Руководство по TypeScript - Объявления переменных. И грамматика спецификации ссылается на BindingPattern это не описано (или я пропустил) в спецификации: TypeScript Spec.

Мое первое впечатление, что это не очень полезно, так как ...other это уже имя пользовательской переменной. Но это работает. И мне любопытно узнать, где оно конкретно определено или работает только угловой пример (полагаю, что нет).

1 ответ

Ссылка на справочник, которую вы упомянули, охватывает большинство сценариев, которые вы используете в своем примере при деструктуризации, но я думаю, что одна ситуация, которую он охватывает, явно не рассматривается (только неявно).

Особенностью, на которую вы ссылаетесь (я думаю), является сочетание:

Вы можете создать переменную для оставшихся элементов в объекте, используя синтаксис ...:

а также

Вы также можете дать разные имена свойствам:

Руководство не дает пример, где используются оба, как показано ниже. Интересной частью этого комбинированного использования является то, что ...other токен на самом деле ничего не значит и никогда не ссылается (или не ссылается). В "рабочей" версии приведенного ниже примера без строки ошибок other токен вообще не появляется в выводе.

Вот сокращенный пример:

const values = { a: "1", b: "2", c: "3", d: "4" };

const { a: one, ...other: twoThreeFour } = values;

console.log(other); // ERROR there is no variable 'other'
console.log(a, twoThreeFour); // OK

И версия без ошибки - перенесенный JavaScript не имеет ссылки на other в любом месте кода:

const values = { a: "1", b: "2", c: "3", d: "4" };

const { a: one, ...other: twoThreeFour } = values;

console.log(a, twoThreeFour); // OK

Существует проблема повышения ясности использования остальных элементов в отношении деструктурирования в базовой спецификации языка.

Другие вопросы по тегам