让流程假设地图中确实存在特定键

时间:2019-05-29 16:19:53

标签: flowtype

由于您迭代某个事物的方式,您可能知道某个键始终存在于Map中,但是流程可能不知道。

当前,我要摆脱的方法是检查从get()返回的结果是否未定义。

虽然我不想添加这些虚假检查,但我想告诉类型系统它可以假定该键存在。将其告知类型系统还可以将有关程序的更多信息(肯定存在此密钥)传达给将来的读者,而不是虚假的检查(此密钥可能存在或不存在,如果不存在,那么我们将忽略这种情况)< / p>

因此,我希望能够通过最好在第3行或之前添加一些内容而不是if检查来实现以下目的。

1. let score:Map<string, number> = new Map()
2. initialize(score); // some magic initilization of the map that flow doesn't understand
3. score.get("hello");

1 个答案:

答案 0 :(得分:0)

我不建议您这样做,但是您可以extendMap来定义自己的类,该类定义get

declare class MyMap<K, V> extends Map<K,V> {
    get(key: 'hello'): V;
    get(key: K): V | void;
}

,以便(new myMap()).get('hello')的类型为V,而不是V | void。例如,

const myMap: MyMap<string, number> = new MyMap();
const n: number = myMap.get('hello');
const o: number = myMap.get('not hello'); // error
const p: number | void = myMap.get('not hello');

Try Flow

您需要更改代码,以便initialize返回MyMap而不是修改传入的Map。请注意,尽管这将通过Flow,但在运行期间仍可能会中断。从上面的示例中可以看到,即使我创建了new MyMap(),也没有添加键'hello',所以n并不是真正的number