Является ли "экспорт {foo по умолчанию}" действительным ES2015?
я получил выпуск на GitHub о моем плагине импорта/экспорта модуля ES2015 для ESLint, не распознающем default экспорт в следующий синтаксис:
export {
foo as default,
bar
}
где мой плагин будет Линт следующее (эквивалент?) синтаксис нет проблем:
export default foo;
export const bar = ..;
и Бабель и Esprima разбирать подобный синтаксис без ошибок, и это работает для кода с использованием Babel на обоих концах (импорт и экспортный.)
однако я не убежден в spec позволяет бывшей export { x as default } форма:
для каждого
IdentifierNamenнаReferencedBindingsofExportClause: это синтаксическая ошибка, если StringValue n является зарезервированным словом или если StringValue n является одним из: "implements", "interface", "let", "package", "private", "protected", "public", "static" или "yield".
ReservedWord включает default, хотя я думаю, что могу поспорить, что ReferencedBindings ссыль конкретно к модулю-имена локальных идентификаторов вот такэкспорт (т. е. foo), а не само экспортируемое имя.
это также обычно кажется странным, чтобы иметь возможность экспортировать зарезервированные слова; Вавилон с радостью также позволит что-то вроде
// ./foo.js
export { foo as yield }
// ./mod.js
import { yield as nonReservedIdentifier } from './foo'
Итак, вкратце: есть export { foo as default } допустимый способ экспорта значения по умолчанию в ES2015?
2 ответов
да ReferencedBindings относится только к первому IdentifierName. Так что
export { default as something } // or
export { default }
недопустимо, но
export { something as default }
нет. ESLint нужно будет исправить здесь.
Да, это действует. Я его сломаю.
-
:
export { foo as default }это соответствует следующим производствам (от наименее до наиболее конкретных):
export ExportClause ExportClause : { ExportsList } ExportsList : ExportSpecifier ExportSpecifier : IdentifierName as IdentifierName -
тогда у вас есть ранняя семантика ошибка:
15.2.3.1 Статическая Семантика: Ранние Ошибки
ExportDeclaration : export ExportClause ;для каждого
IdentifierNamenнаReferencedBindingsofExportClause: это синтаксическая ошибка еслиStringValueofnэтоReservedWord...они применяются к любым производствам, соответствующим
export ExportClause, включая синтаксис вашего примера. Это вызывает . -
на
ReferencedBindingsалгоритм, который применяется к этому наиболее специфическому производству, сопоставленному этому синтаксису:ExportSpecifier : IdentifierName as IdentifierNameвозвратить
Listсодержащий первыйIdentifierName.
Итак, вы видите, что ограничение в отношении ReservedWord и другие перечисленные значения применяются только к foo часть синтаксиса в вашем примере.