ES modulesのexport defaultは使わないほうがよい

ES modulesにexport defaultってのがあるんですが、default exportのexport対象に名前が必須でないため、IDEによるコード補完と相性が悪いです。

他のところはどうしてるのかなと思って調べてみると、GoogleのTypeScript Style Guide では禁止されてました(v1.0.0, 2019/07 現在)。

TypeScript compiler coding guidelineには特に言及はないみたいですね。

そもそもexport defaultは仕様が不安定で処理系によって挙動が異なる困ったヤツ*1*2という認識です。

総じて見るとメリットは特になくデメリットがいくつかあるという状態なので、「使わない」とするのがよさそうな気がします。


(追記 2019/07/23)

"TypeScript Deep Dive" というTypeScript解説書でも default export を避けるべきという章が設けられてます。理由はこのエントリで説明したものとほぼ同じです。

*1:うちだとBabelからTypeScriptに移行するときに import React from "react" を import * as React from "react" に書き換える必要がありました。このケースで誰が悪いのかは調べてませんが…。

*2:追記: TypeScript 2.7 でこの部分はCommonJSとの相互運用できる変換オプションが追加されたようです (--esModuleInterop) https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html