環境
- ES2015
- typescript 2.9.2
- react-native 0.57.8
JavaScript のモジュール機能(import/export
)についてメモ
- 調べたきっかけ
ドキュメント
メモ : 名前付きエスクポート vs デフォルトエクスポート
エクスポート方法は
名前付きエクスポート
とデフォルトエクスポート
の 2 種類あるexport
//名前付きエクスポートexport default
//デフォルトエクスポート
インポートの際、名前の付け方が異なる
名前つきエクスポート
import {エクスポートしたメンバ名} from 'モジュールファイル名';
- エクスポートしたメンバ名をそのまま使う
- メンバ名を波括弧で括る
- ※別の名前でつかう場合は
as
を使うimport {エクスポートしたメンバ名} as 別の名前 from 'モジュールファイル名';
デフォルトエクスポート
import 好きな名前 from 'モジュールファイル名';
- 名前を自由に指定できる
- メンバ名を波括弧で括らない
- ※デフォルトエクスポートできるメンバは、モジュール 1 つに対して 1 つに限る
サンプル
デフォルトエクスポート
したメンバをimport {メンバ名}
してしまうとundefined
になる
// モジュールファイル test.js export default class Test { //デフォルトエクスポート static hoge = () => {console.log('test')} }
import Test from "test"; console.log(typeof Test); //function ※1 Test.hoge(); // test
import Hoge from "test"; //デフォルトエクスポートされたメンバは、名前を自由に指定できる Hoge.hoge(); // test
import {Test} from "test"; //デフォルトエクスポートされたメンバを {} で括ってはダメ console.log(typeof Test); //undefined Test.hoge(); //エラー TypeError: Cannot read property 'hoge' of undefined
- ※1
- Class を
typeof
するとfunction
が返る
- Class を
せっかくなので
import * as React from 'react';
を少し貼り下げて理解してみた
`import * as React from 'react';` //すべてのモジュールをまとめてインポート ↓ class App extends React.Component<Props, State> { }
`import React, {Componet} from 'react';` //* を使わなかった場合 ↓ class App extends Component<Props, State> { //こう書くハズ }
- 似たような話が stackoverflow にあった