Javascript 反应-流动及;条件渲染
我正在对React Native使用Flow。我遇到了VSCode提出的一个流问题,我不知道如何改变我的方法以符合流类型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
/* @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。