Переименование оставшейся переменной свойства при разрушении объекта в 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
Существует проблема повышения ясности использования остальных элементов в отношении деструктурирования в базовой спецификации языка.