flowの存在型の定義
An existential type is used as a placeholder to tell Flow to infer the type.
存在型がFlowに自動的に推測してくれっと指示するためのプレースホルダである。
次の例では、実際に渡されたdataの1
であるため、自動的にT
がnumberと認識される。そのため、戻り値を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つに限定したい場合、型をはっきり記載する
- 冗長な記載を避けたい場合、存在型
*
を使っても良い