[英]Is `export { foo as default }` valid ES2015?
我在GitHub上收到一个关于ESLint的ES2015模块导入/导出验证插件的问题,但没有通过以下语法识别default
导出:
export {
foo as default,
bar
}
我的插件将lint下面(等效?)语法没问题:
export default foo;
export const bar = ..;
Babel和Esprima都解析了类似的语法而没有错误,这适用于两端使用Babel的代码(导入和导出)。
但是,我不相信规范允许前export { x as default }
形式:
对于
ExportClause
ReferencedBindings
的每个IdentifierName
n
:如果n的StringValue是ReservedWord,或者n的StringValue是以下之一,则它是语法错误:“implements”,“interface”,“let”,“package”,“private” ,“受保护”,“公共”,“静态”或“收益”。
ReservedWord
确实包含default
,但我认为有人可能认为ReferencedBindings
特指的是正在导出 的模块本地标识符名称 (即foo
)而不是导出的名称本身。
能够导出保留字通常似乎是一件奇怪的事情; 巴别塔也很乐意也允许这样的事情
// ./foo.js
export { foo as yield }
// ./mod.js
import { yield as nonReservedIdentifier } from './foo'
那么,总结一下: export { foo as default }
是在ES2015中导出默认值的有效方法吗?
是的, 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 ;
对于
ExportClause
ReferencedBindings
的每个IdentifierName
n
:如果n
StringValue
是ReservedWord
,则为语法错误...
这些适用于与export ExportClause
匹配的任何产品,包括您的示例语法。 这将调用ReferencedBindings
算法。
适用于与此语法匹配的最特定生产的ReferencedBindings
算法是:
ExportSpecifier : IdentifierName as IdentifierName
返回包含第一个
IdentifierName
的List
。
因此,您会看到有关ReservedWord
和其他列出值的限制仅适用于示例中语法的foo
部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.