Javascript 在流中将混合细化为已知对象类型

Javascript 在流中将混合细化为已知对象类型,javascript,flowtype,Javascript,Flowtype,我们试图在流中进行类型细化,以防止值在外部接口进入我们的应用程序。为了做到这一点,我们使用了mixed,然后试图细化到已知的类型,但Flow并不能让它变得简单 以下内容似乎应该可以使用,我已经验证了mixedtype值是否与response类型的要求匹配 type Response = { head: string } const refineToResponse = (value: mixed): ?Response => { if (value &&

我们试图在流中进行类型细化,以防止值在外部接口进入我们的应用程序。为了做到这一点,我们使用了
mixed
,然后试图细化到已知的类型,但Flow并不能让它变得简单

以下内容似乎应该可以使用,我已经验证了
mixed
type值是否与
response
类型的要求匹配

type Response = { head: string }

const refineToResponse = (value: mixed): ?Response => {   
  if (value
    && typeof value === "object"
    && typeof value.head === "string") {

    return value;   
  }

  return null; 
};
但我刚刚收到一条毫无帮助的错误信息:

属性
head
不兼容:

 11: const refineToResponse = (value: mixed): ?Response => {
                                                 ^^^^^ mixed. This type is incompatible with
  8:   head: string
             ^^^^^^ string
编辑:


那是不安全的。如果某个对象在运行时具有类型
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; 
};

哪里是obj?剪切粘贴失败:)啊,关于突变的讨论是有意义的。你的意思是,在其他地方,我可以对原始的
对象进行变异,并破坏我输入的
响应
,它应该是已知的类型。干杯是否可以返回
value
的浅层副本,而不是列出响应对象中的每个属性?类似于
returnobject.assign({},value)
return{…value}
const refineToResponse = (value: mixed): ?Response => {   
  if (value
    && typeof value === "object"
    && typeof value.head === "string") {

    return { head: value.head };   
  }

  return null; 
};