Является ли "экспорт {foo по умолчанию}" действительным ES2015?
я получил выпуск на GitHub о моем плагине импорта/экспорта модуля ES2015 для ESLint, не распознающем default
экспорт в следующий синтаксис:
export {
foo as default,
bar
}
где мой плагин будет Линт следующее (эквивалент?) синтаксис нет проблем:
export default foo;
export const bar = ..;
и Бабель и Esprima разбирать подобный синтаксис без ошибок, и это работает для кода с использованием Babel на обоих концах (импорт и экспортный.)
однако я не убежден в spec позволяет бывшей export { x as default }
форма:
для каждого
IdentifierName
n
наReferencedBindings
ofExportClause
: это синтаксическая ошибка, если 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 ;
для каждого
IdentifierName
n
наReferencedBindings
ofExportClause
: это синтаксическая ошибка еслиStringValue
ofn
этоReservedWord
...они применяются к любым производствам, соответствующим
export ExportClause
, включая синтаксис вашего примера. Это вызывает . -
на
ReferencedBindings
алгоритм, который применяется к этому наиболее специфическому производству, сопоставленному этому синтаксису:ExportSpecifier : IdentifierName as IdentifierName
возвратить
List
содержащий первыйIdentifierName
.
Итак, вы видите, что ограничение в отношении ReservedWord
и другие перечисленные значения применяются только к foo
часть синтаксиса в вашем примере.