在此问题中,发生了几种不同的事情:
我声明常量并为其分配特定类型:
const VAR1: 'var1' = 'var1';
const VAR2: 'var2' = 'var2';
然后我声明一个要查找其字段的对象。该字段的键是一个与上面的常量之一相对应的字符串:
type Values = {
var1: string
}
const VALUES: Values = {
[VAR1]: '11'
}
然后我声明一个变量,该变量可以是两个常量之一:
type X = typeof VAR1 | typeof VAR2
现在,我要检查变量是否与对象中用于字段名称的常量相同。如果是,那么我想从对象中获取相应的值:
function test(x: X) {
if (x === VAR1) {
return VALUES[x];
}
}
问题是,条件if (x === VAR1)
无法执行动态类型优化,因此Flow不知道在行return VALUES[x]
处x的类型为VAR1
,并抱怨说值对象中没有var2
字段。
如果用字符串文字'var1'
替换常量,检查会起作用,但是有没有办法在保留常量的同时解决这个问题?