我看到ImmutableJS has flow type annotations now,但如何定义类型?例如:
const state : ??? = Immutable.fromJS({ name: 'chet', tags: ['something']})
我可以从普通JS定义类型,但是我怎么说这是一个带有某些键的Immutable.Map?
答案 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方法。