尝试在我的项目中设置Flow,但是不太了解如何使用Immutable记录.我想静态检查组件道具,这是我在做的方式: // @flowimport React from "react";import {render} from "react-dom";import * as I from "immutable";co
// @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
由于语言的限制,记录没有进行类型检查.但是您可以使用上面提供的声明来改进类型检查.