環境
- 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 にあった