Flow 0.3.0 以降、別のモジュールから型をインポートできるようになりました。例えば、型注釈で参照する目的でのみクラスをインポートする場合、新しい import type 構文を使用できるようになりました。
動機
このような経験はありませんか?
// @flow
// Post-transformation lint error: Unused variable 'URI'
import URI from "URI";
// But if you delete the require you get a Flow error:
// identifier URI - Unknown global name
module.exports = function(x: URI): URI {
  return x;
}
これで解決策があります!この問題を解決するために(そして、ES6モジュール構文の近い将来を見据えて)、新しい import type 構文を追加しました。import type を使用すると、ここで本当に意味したいこと、つまりクラス自体ではなく、クラスの型をインポートしたいということを伝えることができます。
Import Type の導入
上記のコードの代わりに、次のように書くことができるようになりました。
// @flow
import type URI from 'URI';
module.exports = function(x: URI): URI {
  return x;
};
複数のクラス(例えば、Crayon クラスと Marker クラスのような)をエクスポートするモジュールがある場合、それらの型のそれぞれを、次のようにまとめてまたは別々にインポートできます。
// @flow
import type {Crayon, Marker} from 'WritingUtensils';
module.exports = function junkDrawer(x: Crayon, y: Marker): void {}
変換
型注釈やその他の Flow の機能と同様に、import type も、コードを実行する前に変換する必要があります。変換は、react-tools 0.13.0 がまもなく公開される際に利用可能になりますが、今のところは 0.13.0-beta.2 で利用可能であり、以下のようにインストールできます。
npm install react-tools@0.13.0-beta.2
想定される Q&A
ちょっと待って、import type 宣言を追加した後、実行時に何が起こるのですか?
何も起こりません!他の Flow の構文と同様に、すべての import type 宣言は削除されます。
import type を使用して、別のモジュールから型エイリアスを取り込むこともできますか?
編集:はい!Flow 0.10 以降では、import type 構文を補完するために export type MyType = ... ; 構文を使用できます。以下は簡単な例です。
// @flow
// MyTypes.js
export type UserID = number;
export type User = {
  id: UserID,
  firstName: string,
  lastName: string
};
// @flow
// User.js
import type {UserID, User} from "MyTypes";
function getUserID(user: User): UserID {
  return user.id;
}
今のところ、明示的な名前付きエクスポートステートメント(つまり、export type UserID = number;)のみをサポートしていることに注意してください。将来のバージョンでは、潜在的な名前付きエクスポートステートメント(つまり、type UserID = number; export {UserID};)およびデフォルトの型エクスポート(つまり、export default type MyType = ... ;)のサポートを追加できます…ただし、今のところ、これらの形式は型エクスポートではまだサポートされていません。