簡體   English   中英

是`export {foo as default}`有效的ES2015?

[英]Is `export { foo as default }` valid ES2015?

在GitHub上收到一個關於ESLint的ES2015模塊導入/導出驗證插件的問題,但沒有通過以下語法識別default導出:

export { 
    foo as default,
    bar
}

我的插件將lint下面(等效?)語法沒問題:

export default foo;
export const bar = ..;

BabelEsprima都解析了類似的語法而沒有錯誤,這適用於兩端使用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需要在這里修復。

是的,它是有效的。 我會把它分解。

  1.  export { foo as default } 

    這符合以下制作(從最少到最具體):

     export ExportClause ExportClause : { ExportsList } ExportsList : ExportSpecifier ExportSpecifier : IdentifierName as IdentifierName 
  2. 然后你有早期的錯誤語義

    15.2.3.1靜態語義:早期錯誤

    ExportDeclaration : export ExportClause ;

    對於ExportClause ReferencedBindings的每個IdentifierName n :如果n StringValueReservedWord ,則為語法錯誤...

    這些適用於與export ExportClause匹配的任何產品,包括您的示例語法。 這將調用ReferencedBindings算法。

  3. 適用於與此語法匹配的最特定生產的ReferencedBindings算法是:

    ExportSpecifier : IdentifierName as IdentifierName

    返回包含第一個IdentifierNameList

因此,您會看到有關ReservedWord和其他列出值的限制僅適用於示例中語法的foo部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM