Javascript Can';t将类型设置为数组<;字符串>;in-flow js
我在函数getRowData最后一行之前的一行中遇到以下错误: 消息:“无法使用绑定到Javascript Can';t将类型设置为数组<;字符串>;in-flow js,javascript,reactjs,visual-studio-code,flowtype,Javascript,Reactjs,Visual Studio Code,Flowtype,我在函数getRowData最后一行之前的一行中遇到以下错误: 消息:“无法使用绑定到数据的el.arr调用getRow,因为: 未知类型[1]的属性arr与数组不兼容 类型[2]。或未知类型[1]的属性arr与不兼容 字符串[3]。(参考文献:[1][2][3]),地址:'60,44'来源:'flow' 代码:“未定义” 只有将type UserProps中的数组更改为数组时,此错误才会消失,但我希望保留字符串数组 我不明白为什么我会犯这个错误。我明确地将data.audio和data.cha
数据的el.arr
调用getRow
,因为:
未知类型[1]的属性arr
与数组不兼容
类型[2]。或未知类型[1]的属性arr
与不兼容
字符串[3]。(参考文献:[1][2][3]),地址:'60,44'来源:'flow'
代码:“未定义”
只有将type UserProps
中的数组更改为数组
时,此错误才会消失,但我希望保留字符串数组
我不明白为什么我会犯这个错误。我明确地将data.audio
和data.chat
设置为Array
。任何帮助都将不胜感激
type UserProps = {
name: string,
audio: Array<string>,
chat: Array<string>,
enableChat: boolean,
enableAudio: boolean,
status: string,
};
const getRow = (key, data: string[] | string, style = {}) => {
const text = Array.isArray(data) ? data.join(", ") : data;
return (
<TableRowColumn
key={`row-${key}`}
style={{ whiteSpace: "pre-wrap", ...style }}
>
{text}
</TableRowColumn>
);
};
const getRowData = (data: UserProps) =>
[
data.name,
data.status,
{
arr: data.audio,
style: { color: data.enableAudio ? "green" : "red" }
},
{ arr: data.chat, style: { color: data.enableChat ? "green" : "red" } }
].map(
(el, i) =>
el && el.arr && el.style ? getRow(i, el.arr, el.style) : getRow(i, el) // error in el.arr !!!!!
);
type UserProps={
名称:string,
音频:阵列,
聊天室:数组,
enableChat:boolean,
enableAudio:boolean,
状态:字符串,
};
const getRow=(键,数据:string[]| string,style={})=>{
const text=Array.isArray(数据)?data.join(“,”):数据;
返回(
{text}
);
};
const getRowData=(数据:UserProps)=>
[
data.name,
数据。状态,
{
arr:data.audio,
样式:{color:data.enableAudio?“绿色”:“红色”}
},
{arr:data.chat,样式:{color:data.enableChat?“绿色”:“红色”}
].地图(
(el,i)=>
el&&el.arr&&el.style?getRow(i,el.arr,el.style):getRow(i,el)//el.arr中有错误!!!!!
);
getDataRow
没有带注释的返回类型,因此它由返回值暗示,返回值是由字符串、字符串、对象、对象组成的数组,然后通过map
(返回与输入相同的类型)传递<因此,map
回调中的code>el
是string | object
流无法确定arr
是字符串还是对象的属性。它可能是未定义的(我发现flow对复合逻辑测试的解释有问题,就像你在el&&el.arr&&el.style
中所做的那样。如果你将它们拼写为If
语句,它们会按预期工作,但是逻辑&
和|
似乎有问题)
因此,flow认为el.arr
与getRow
的第二个参数不兼容,后者需要string[]| string
在访问属性之前,您需要确定el
的类型,以使flow愉快。测试成员arr
和style
的存在性并不能做到这一点(尽管如果您的类型是可延展的,您可能希望将不相交的并集视为实现这一点的一种方法,但我认为在这种情况下这不起作用,因为您别无选择,只能使用string
的股票定义)
作为旁注,虽然速记数组语法({type}[]
)很方便,但在?
的作用域变小之前,它可能会与可选值或可能的值混淆。因此,我选择了使用longhandArray
语法。文档中有更多关于这个主题的内容。getDataRow
没有带注释的返回类型,因此它由返回值暗示,返回值是一个由字符串、字符串、对象、对象组成的数组,然后通过map
(返回与输入相同的类型)<因此,map
回调中的code>el
是string | object
流无法确定arr
是字符串还是对象的属性。它可能是未定义的(我发现flow对复合逻辑测试的解释有问题,就像你在el&&el.arr&&el.style
中所做的那样。如果你将它们拼写为If
语句,它们会按预期工作,但是逻辑&
和|
似乎有问题)
因此,flow认为el.arr
与getRow
的第二个参数不兼容,后者需要string[]| string
在访问属性之前,您需要确定el
的类型,以使flow愉快。测试成员arr
和style
的存在性并不能做到这一点(尽管如果您的类型是可延展的,您可能希望将不相交的并集视为实现这一点的一种方法,但我认为在这种情况下这不起作用,因为您别无选择,只能使用string
的股票定义)
作为旁注,虽然速记数组语法(
{type}[]
)很方便,但在?
的作用域变小之前,它可能会与可选值或可能的值混淆。因此,我选择了使用longhandArray
语法。文档中有更多关于这个主题的内容。错误有点让人困惑,但问题是flow无法细化el
类型。您可以做的是稍微更改细化:
typeof el === 'string' ? getRow(i, el) : getRow(i, el.arr, el.style)
您可以试试它。错误有点混乱,但问题是flow无法细化
el
类型。您可以做的是稍微更改细化:
typeof el === 'string' ? getRow(i, el) : getRow(i, el.arr, el.style)
你可以试试这个新问题,但是:
Array
是否等于string[]
?是的,与string[]的错误相同新手问题,但是:Array
是否等于string[]
?是的,与string[]的错误相同