JSX 元素类型错误:将类型添加到从 .map 函数返回的对象

Posted

技术标签:

【中文标题】JSX 元素类型错误:将类型添加到从 .map 函数返回的对象【英文标题】:JSX Element Type Error: Adding Types to object returned from .map function 【发布时间】:2020-04-29 15:34:39 【问题描述】:

我正在尝试将item 类型添加到从 .map 函数返回的对象中。但是,我遇到了 JSX 错误,我尝试将 item: JSX.Element 添加到 Item 类型,但这似乎无法正常工作。有人可以为我澄清一下吗?下面是错误、类型和代码。

错误:

src/ListPicker.tsx:69:28 - error TS2345: Argument of type '(item: Item) => JSX.Element' is not assignable to parameter of type '(value: string, index: number, array: string[]) => Element'.
  Types of parameters 'item' and 'value' are incompatible.
    Type 'string' is not assignable to type 'Item'.

      props.items.map((item: Item) => 
                              ~~~~~~~~~~~~~~~~~

类型:

// TypeScript: Types
interface Props 
  title: string,
  items: Array<string>,
  onPress: Function,
  onValueChange: Function,


interface Item 
  label: string,
  value: string,
  key: number | string,
  color: string,
;

ListPicker.tsx:

// Render ios Picker
  const renderIOSPicker = () => 
    try 
      return (
        <Picker
          selectedValue=value
          onValueChange=selectValue>
          props.items.map((item: Item) => 
            return (
              <Picker.Item
                label=item.label
                value=item.value
                key=item.key || item.label
                color=item.color
              />
            );
          )
        </Picker>
      )
    
    catch (error) 
      console.log(error);
    
  ;

【问题讨论】:

看起来你的道具将items定义为一个字符串数组,所以当映射一个字符串数组时,映射回调签名是(element: string, index: number, array: string[])。我认为如果您将items 的道具接口更新为items: Array&lt;Item&gt;,,它现在应该匹配。如果这是正确的,那么我可以添加为答案。 【参考方案1】:

看起来您的道具将items 定义为字符串数组,因此当映射字符串数组时,映射回调签名为(element: string, index: number, array: string[])。我想如果你将 items 的 props 接口更新为 items: Array&lt;Item&gt;,,它现在应该匹配了。

// TypeScript: Types
interface Item 
  label: string,
  value: string,
  key: number | string,
  color: string,
;

interface Props 
  title: string,
  items: Array<Item>, // use array of type you defined above
  onPress: Function,
  onValueChange: Function,

【讨论】:

【参考方案2】:

这里的问题似乎是item 的类型(即在您的map 函数的参数中)与items 数组的类型(在Props 接口中定义)之间的不一致。

您的Props 接口将items 字段定义为字符串数组,而您的渲染代码期望items 字段为Item 对象数组。

如果你能够修改和重构你的代码,那么Props 被定义为:

interface Props 
  title: string,
  items: Array<Item>,
  onPress: Function,
  onValueChange: Function,

那么这应该可以解决错误。

【讨论】:

以上是关于JSX 元素类型错误:将类型添加到从 .map 函数返回的对象的主要内容,如果未能解决你的问题,请参考以下文章

泛函编程(14)-try to map them all

类型“JSX.Element”不可分配给类型“元素”

ch11 持有对象

带有 react-dnd 的 TypeScript 2.0 给出错误“JSX 元素属性可能不是联合类型”

JSX 元素类型 'Route' 没有任何构造或调用签名

JSX元素类型[外部模块]没有任何构造或调用签名