在使用isMap()检查后,为什么Flow不能告诉我的对象是不可变的映射?

时间:2017-04-28 09:46:42

标签: javascript immutable.js flowtype

我正在尝试解决为什么Flow在这里出错:

// @flow

import { Map } from 'immutable';

type Filemap = Map<string, Buffer>;
type FilemapCompatibleObject = Filemap | { [string]: Buffer };

export const castFilemap = (object: FilemapCompatibleObject): Filemap => {
  // checking with instanceof works fine
  if (object instanceof Map) {
    return object;
  }

  // checking with isMap does not
  if (Map.isMap(object)) {
    return object;
    // ^^^ FLOW ERROR: object type This type is incompatible with the expected return type of Map
  }

  return Map(object);
};

检查Map.isMap(object)后,我知道对象是Map,但Flow不是。为什么不?有什么方法可以'告知'Flow它现在是一张地图吗?

可能的子问题:使用Map.isMap(obj)而不是obj instanceof Map是否有任何优势? (如果不是,为什么他们提供静态方法?)

编辑:看Immutable's own typedef它似乎有一些有趣的%checks语法来解决我遇到的问题,但它似乎对我不起作用。而且我找不到文档。

declare function isMap(maybeMap: mixed): boolean %checks(maybeMap instanceof Map);

1 个答案:

答案 0 :(得分:1)

回答我自己的问题......

看起来问题是%checks尚未在Immutable中发布。最新稳定版3.8.1 doesn't have it

此外,它似乎还没有流量稳定(截至v0.45)。