9

私はESLintは、次の構文でdefault輸出を認識しないための私のES2015モジュールのインポート/エクスポートの検証プラグインについてissue on GitHubを受け`export {foo as default}`は有効ですか?ES2015?</p> <pre><code>export { foo as default, bar } </code></pre> <p>私のプラグインは、以下の(?相当)lintのでしょう構文は何の問題:

export default foo; 
export const bar = ..; 

両方BabelEsprimaがエラーなしで同様の構文を解析し、その両端(インポートおよびエクスポート)にバベルを使用してコードのために働きます。 STRINGVALUEがnのReservedWordまたはSTRINGVALUE場合であればそれは構文エラーです:ExportClauseReferencedBindingsの各IdentifierNamenに対して

はしかし、私はspec前者export { x as default }フォームすることができます確信していません「実装」、「インターフェース」、「let」、「package」、「private」、「protected」、「public」、「static」、「yield」のいずれかです。

ReservedWorddoes include defaultに、私は1つのReferencedBindingsエクスポート名自体を(すなわちfoo)をエクスポートしていないされているspecifically to the module-local identifier namesを参照していると主張することができると思うけれども。

一般に、予約語をエクスポートすることは奇妙なことのようです。バベルは喜んでも要約で、だから、

// ./foo.js 
export { foo as yield } 
// ./mod.js 
import { yield as nonReservedIdentifier } from './foo' 

のようなものができるようになります:export { foo as default }はES2015にデフォルトをエクスポートするための有効な方法は何ですか?

答えて

8

はい、ReferencedBindingsは、最初のIdentifierNameのみを参照します。だから、

export { default as something } // or 
export { default } 

は無効ですが、

export { something as default } 

ではありません。 ESLintはここで修正が必要です。

+0

この場合、 'default'は' default'または実際の 'default'エクスポートと呼ばれる名前付きエクスポートですか? –

+0

私は[import spec](http://www.ecma-international.org/ecma-262/6.0/#sec-static-semantics-importentriesformodule)はそれが両方であると推測します。 –

+0

はい、デフォルトのエクスポートは 'default'という名前のエクスポートされたバインドです。両方ともそうですが、デフォルトのエクスポートをエクスポート/インポートするための特別な構文があり、 'default'は無効なローカル識別子です。 – Bergi

6

はい、有効です。私はそれを打ち破ります。

  1. :次に、あなたはearly error semanticsを持って

    export ExportClause 
    ExportClause : { ExportsList } 
    ExportsList : ExportSpecifier 
    ExportSpecifier : IdentifierName as IdentifierName  
    
  2. 15.2

    export { foo as default } 
    

    これは(少なくともから最も具体的に)以下の作品にマッチします。 3。1つの静的意味:ExportClauseReferencedBindingsの各IdentifierNamenの早期エラー

    ExportDeclaration : export ExportClause ;

    nStringValueは、これらがどの作品にも適用ReservedWord ...

    であればそれは構文エラーですexport ExportClauseにマッチします。これによりReferencedBindingsアルゴリズムが呼び出されます。この構文で一致したことを最も具体的な生産に適用される

  3. ReferencedBindingsアルゴリズムは次のとおりです。

    ExportSpecifier : IdentifierName as IdentifierName

    戻る最初IdentifierNameを含むList

だから、ReservedWordに関する制限や他の上場の値は、あなたの例では、構文のfoo一部に適用されていることを確認。

関連する問題