由于您迭代某个事物的方式,您可能知道某个键始终存在于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");
答案 0 :(得分:0)
我不建议您这样做,但是您可以extend
类Map
来定义自己的类,该类定义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');
您需要更改代码,以便initialize
返回MyMap
而不是修改传入的Map
。请注意,尽管这将通过Flow,但在运行期间仍可能会中断。从上面的示例中可以看到,即使我创建了new MyMap()
,也没有添加键'hello'
,所以n
并不是真正的number
。