如何为ImmutableJS类型编写流类型定义?

时间:2016-08-25 22:30:52

标签: javascript immutable.js flowtype

我看到ImmutableJS has flow type annotations now,但如何定义类型?例如:

const state : ??? = Immutable.fromJS({ name: 'chet', tags: ['something']})

我可以从普通JS定义类型,但是我怎么说这是一个带有某些键的Immutable.Map?

3 个答案:

答案 0 :(得分:2)

现在的问题是,不可变流类型仅支持每个键和值组合的一种类型定义。

So immutable.Maps接受Map<keyType, valueType>

和immutable.List接受List<valueType>

Immutable.fromJS({name:&#39; chet&#39;,tags:[&#39; something&#39;]})

相当于地图({name:&#39; chet&#39;,tags:List([&#39; something])}

所以,你的类型定义是

Map<(string) | ('name', 'tags'), string | List<string>>

答案 1 :(得分:2)

使用Record代替Map(或fromJS)。这不是代码中最漂亮的补充,特别是如果你的状态嵌套Record,但类型检查支持很棒。

// @flow

import { Record, List } from 'immutable';
import type { RecordFactory, RecordOf } from 'immutable';

type StateProps = {
  name: string,
  tags: List<string>,
}

type State = RecordOf<StateProps>;

const makeState: RecordFactory<StateProps> = Record({
  name: '',
  tags: List(),
});

const state: State = makeState({
  name: 'chet',
  tags: List(['something']),
});

// Or, to to create an instance of the default
// const _state: State = makeState();

答案 2 :(得分:1)

我会将此类型写为

const state: Map<string, any>

这表示状态将是Map类型,并且地图将具有字符串键和(名称,标签),并且值将为any。 另外,请注意,你必须这样做

import type { Map } from 'immutable';

否则它会认为它是本机类型Map,你会看到像Map这样的错误没有get或getIn方法。