【问题标题】:How to write a Flow Type definition for ImmutableJS Types?如何为 ImmutableJS 类型编写流类型定义?
【发布时间】:2017-11-10 09:05:17
【问题描述】:

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

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

我可以从普通的 JS 中定义类型,但如何说这是一个 Immutable.Map 与某些键?

【问题讨论】:

    标签: javascript immutable.js flowtype


    【解决方案1】:

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

    所以 immutable.Maps 接受Map<keyType, valueType>

    并且 immutable.List 接受List<valueType>

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

    等价于 Map({name: 'chet', tags: List(['something])}

    所以,你的类型定义应该是

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

    【讨论】:

    • 不可变流类型是否仍然只支持每个键值组合的一种类型定义?我想做Map<{name: string, tags: List<string>}> 之类的事情,但不知道怎么做
    • 这种特殊性的标准方法是使用不可变记录。它无论如何都不是完美的,但它可以解决问题
    • @I2silver 啊,我明白了。如果我使用 Redux 进行状态管理,是否将整个状态树设为不可变 JS 记录是个好主意?
    • 只需要处理状态树中的不可变对象绝对很方便。我对此并不虔诚,但它可以让事情变得更容易
    【解决方案2】:

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

    // @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();
    

    【讨论】:

      【解决方案3】:

      我会把这种类型写成

      const state: Map<string, any>
      

      这表示状态将是 Map 类型,并且该映射将具有字符串键和(名称,标签),并且值将是任何。
      另外,请注意,您必须这样做

      import type { Map } from 'immutable';
      

      否则它会认为它是本机类型 Map 并且您会看到 Map 没有 get 或 getIn 方法之类的错误。

      【讨论】:

        猜你喜欢
        • 2017-08-25
        • 1970-01-01
        • 2016-10-04
        • 2020-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        相关资源
        最近更新 更多