当前位置 : 主页 > 网页制作 > React >

reactjs – 如何检查提供给React组件的属性是否是带有Flow的Immutable.js记录的实例?

来源:互联网 收集:自由互联 发布时间:2021-06-15
尝试在我的项目中设置Flow,但是不太了解如何使用Immutable记录.我想静态检查组件道具,这是我在做的方式: // @flowimport React from "react";import {render} from "react-dom";import * as I from "immutable";co
尝试在我的项目中设置Flow,但是不太了解如何使用Immutable记录.我想静态检查组件道具,这是我在做的方式:

// @flow

import React from "react";
import {render} from "react-dom";
import * as I from "immutable";

const Person = I.Record({
  name: null,
});

type Props = {
  data: Person,
};

const PersonInfo = (props: Props) => {
  const {data} = props;
  return (
    <span>
      Name: {data.name}
    </span>
  );
};

render(
  <PersonInfo data={1} />, // I would expect to get some compile error here
  document.getElementById("app")
);

我还在项目和.flowconfig中添加了immutable.js.flow.

这实际上是Immutable.js类型定义的问题.它总是返回 any类型.基本上意义记录不是类似的.我进入了为什么记录如此松散地定义 here的原因.它的主旨是,Flow不支持具有对象的交叉类型(记录的类型必须是).但您可以使用 this answer中描述的限制性更强的类型定义覆盖Record类型.我将其复制过:

declare class Record<T: Object> {
  static <T: Object>(spec: T, name?: string): Record<T>;
  get: <A>(key: $Keys<T>) => A;
  set<A>(key: $Keys<T>, value: A): Record<T>;
  remove(key: $Keys<T>): Record<T>;
}

如果将此decleration添加为本地decleration,您将无法再直接访问属性(就像使用data.name一样),但必须使用get函数,如data.get(‘name’) .与增加的类型savety相比,IMO这个定义的缺点很小.现在可悲的是,由于语言中的其他限制,值的类型没有进行类型检查,如illustrated in this example.

遗憾的是,Flow中的stronly类型不可变数据结构没有很好的解决方案.完美所需的功能几乎就是Flow的路线图.

TL; DR

由于语言的限制,记录没有进行类型检查.但是您可以使用上面提供的声明来改进类型检查.

网友评论