flowの存在型の定義

An existential type is used as a placeholder to tell Flow to infer the type.

存在型がFlowに自動的に推測してくれっと指示するためのプレースホルダである。

次の例では、実際に渡されたdataの1であるため、自動的にTnumberと認識される。そのため、戻り値をParamStore<boolean>にすると、flow checkエラーとなる。

// @flow
function makeParamStore<T>(storeClass: Class<ParamStore<T>>, data: T): * {
  return new storeClass(data);
}
(makeParamStore(ParamStore, 1): ParamStore<number>);
(makeParamStore(ParamStore, 1): ParamStore<boolean>); // failed because of the second parameter

任意型と存在型の違い

任意型がなんでも良いので、型安全チェックが失いう。存在型に違う型のデータを入れると怒られる。

次の例では、constructorで先にisOfflineにboolean型を入れたので、次のstringを入れると、flow checkエラーとなる。

// @flow
class DataStore {
  data: *; // If this property weren't defined, you'd get an error just trying to assign `data`
  constructor() {
    this.data = {
      name: 'DataStore',
      isOffline: true
    };
  }
  goOnline() {
    this.data.isOffline = false;
  }
  changeName() {
    this.data.isOffline = 'SomeStore'; // oops, wrong key!
  }
}

感想

  • 1つの変数に違う型のデータを入れたい場合、anyを使う
  • データの型を1つに限定したい場合、型をはっきり記載する
  • 冗長な記載を避けたい場合、存在型*を使っても良い

参考記事

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.