我们正在尝试在Flow中进行类型细化,以防止在外部接口上进入应用程序的值。为此,我们使用mixed
,然后尝试优化已知类型,但Flow并不容易!
以下内容似乎应该有效,我已经验证mixed
类型值符合response
类型的要求。
type Response = { head: string }
const refineToResponse = (value: mixed): ?Response => {
if (value
&& typeof value === "object"
&& typeof value.head === "string") {
return value;
}
return null;
};
但是我收到了一条非常无用的错误消息:
16: return value; ^^^^^ object. This type is incompatible with the expected return type of 11: const refineToResponse = (value: mixed): ?Response => { ^^^^^^^^ object type
属性
head
不兼容:11: const refineToResponse = (value: mixed): ?Response => { ^^^^^ mixed. This type is incompatible with 8: head: string ^^^^^^ string
编辑:
答案 0 :(得分:5)
这样会不安全。如果某些东西在运行时具有类型string
,则并不意味着它具有相同的静态类型,例如它可能是一些枚举:'Foo' | 'Bar'
,因此只需string
就可以实现不安全的突变。另一方面,它可能是number | string
,因此将来head
可能会成为一个数字或任何类型。
相反,您可以执行以下操作:
const refineToResponse = (value: mixed): ?Response => {
if (value
&& typeof value === "object"
&& typeof value.head === "string") {
return { head: value.head };
}
return null;
};