Javascript 反应-流动及;条件渲染

Javascript 反应-流动及;条件渲染,javascript,reactjs,react-native,flowtype,Javascript,Reactjs,React Native,Flowtype,我正在对React Native使用Flow。我遇到了VSCode提出的一个流问题,我不知道如何改变我的方法以符合流类型 /* @flow */ type RandomType = { id: number, unit: string, }; const renderData = (data: RandomType) => { return data.id }; const getRandomTypeOrEmpty = (isempty: boolean): RandomTy

我正在对React Native使用Flow。我遇到了VSCode提出的一个流问题,我不知道如何改变我的方法以符合流类型

/* @flow */

type RandomType = {
  id: number,
  unit: string,
};

const renderData = (data: RandomType) => { return data.id };

const getRandomTypeOrEmpty = (isempty: boolean): RandomType | {} => {
    if (isempty) { return {} }
    return { id: 1, unit: 'litres'}
};

const data = getRandomTypeOrEmpty(true);
if (data && data.id ) { renderData(data) };
16:if(data&&data.id){renderData(data)}; ^无法调用绑定到
data
renderData
,因为属性
id
在对象类型[1]中缺失,但在
RandomType
[2]中存在

这是我的问题:

我有一个函数,可以为我提供数据,数据类型可以是随机类型空对象{}。 然后,我必须调用一个函数,该函数必须采用RandomType参数

因此,我根据带条件的数据值调用此函数。 然而,尽管此函数永远不会使用非RandomType的数据调用,但Flow仍然会引发一个问题

如何修复此错误

感谢您抽出时间

您应该使用来指示可选属性

type RandomNumber = {
  id?: number,
  unit?: string
};

const a: RandomNumber = {}; // works
现在,类型为
RandomNumber
的变量如果为空,则仍然有效

试试这个


/* @flow */

type RandomType = {
  id ?: number,
  unit ?: string
};

const renderData = (data: RandomType) :number => { return data.id };

const getRandomTypeOrEmpty = (isempty: boolean): RandomType => {
    return isempty ? {} : { id: 1, unit: 'litres'}
};

const data = getRandomTypeOrEmpty(true);
if (data && data.id ) { renderData(data) };

问题在于
getRandomTypeOrEmpty
上的返回类型可能返回一个不精确的对象
{}
,该对象上可能有任何键。这意味着它可能有一个
id
键,因此检查
data.id
不允许flow确定您正在处理一个
RandomType

您可以返回一个完全为空的对象,然后问题就消失了:

type RandomType = {
  id: number,
  unit: string,
};

const renderData = (data: RandomType) => { return data.id };

const getRandomTypeOrEmpty = (isempty: boolean): RandomType | {||} /* return an EXACT empty object */ => {
    if (isempty) { return {}.freeze } // <-- freeze the type so it's an exact object
    return { id: 1, unit: 'litres'}
};

const data = getRandomTypeOrEmpty(true);
if (data.id ) { renderData(data) }; // <-- only need to check for presence of id
类型RandomType={
身份证号码:,
单位:弦,
};
const renderData=(数据:RandomType)=>{return data.id};
const getRandomTypeOrEmpty=(isempty:boolean):RandomType |{| |}/*返回一个精确的空对象*/=>{

如果(isempty){return{}.freeze}//,那么如果在调用函数renderData之前不检查id是否存在,函数renderData可能会失败?理想情况下,我希望强制参数包含这些属性,以避免检查它们是否存在。这将“失败”?它只会返回UnfinedNice答案!另外,我可以使用lodash更进一步吗?为什么要专门检查id而不是单位属性?我可以使用u.isEmpty(数据)吗?我没有使用过uzy。isEmpty,它可能提供也可能不提供必要的类型细化级别。你可以检查
数据
,这两种方法都有效。关键是当查看随机类型或空对象时,任何键的存在都足以让流知道它是随机类型。这有意义吗?好的。但是,我如果我想做一些泛型的东西,我可以使用一个函数isEmpty,我可以使用RandomType定义的任何东西:tiny.cc/2kyq6yMm,Flow不是很聪明,一旦你离开它,它就不能在
isEmpty
函数中保留类型细化。在这里阅读更多信息:.PS如果你喜欢我的答案,请投上一票。:-)我尝试了d正在做一些事情,但Flow可能不太理解Object.keys。