You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

React TypeScript中调用setState更新数组时遭遇TS2345类型错误的解决求助

解决React TypeScript中useState数组更新的TS2345错误

嘿,我来帮你搞定这个TypeScript错误!先拆解下问题出在哪:

错误根源分析

你碰到的TS2345错误,核心是两处类型不匹配:

  1. Props类型定义偏差:在emailpage.tsx里,你把items的类型设成了string | any,但它实际应该和父组件的useState<string[]>([])对应,是string[]类型。
  2. setItem更新函数参数类型错误:调用setItem时,你把更新函数的参数i标注成了string,但它其实是当前的数组状态,类型应该是string[]

分步修正代码

1. 修正Props类型(emailpage.tsx)

items的类型改成正确的数组类型:

type Props = { 
  // 其他属性保持不变
  items?: string[]; // 从string | any修正为string[]
  setItem: (items: string[]) => void; 
  // 其他属性保持不变
};

2. 修正setItem的调用(emailpage.tsx的handlePaste函数)

更新函数的参数i要标注为string[],同时优化异步更新后的日志打印:

const handlePaste = (evt: React.ClipboardEvent) => { 
  evt.preventDefault(); 
  const paste = evt.clipboardData.getData("text"); 
  const emails = paste.match(/[\w\d\.-]+@[\w\d\.-]+\.[\w\d\.-]+/g); 
  if (emails) { 
    const toBeAdded = emails.filter((email) => !isInList(email)); 
    // 修正参数i的类型为string[],同时直接在更新函数内打印新数组(解决useState异步更新的日志延迟问题)
    setItem((i: string[]) => {
      const newItems = [...i, ...toBeAdded];
      console.log("items after", newItems);
      return newItems;
    }); 
  } 
};

小提示:你原来直接console.log("items after", items)可能看不到最新值,因为useState的更新是异步的,在更新函数内部打印新生成的数组才是准确的。

3. 确保辅助函数类型正确(补充isInList示例)

虽然你没贴isInList的代码,但要保证它的类型逻辑和数组匹配,比如:

const isInList = (email: string) => {
  return items?.includes(email) || false;
};

最后验证父组件传递的Props

父组件Email里的items={items}setItem={setItem}是完全正确的,因为itemsstring[]类型,setItem的类型也和子组件Props定义完全匹配。

这样修改后,那个TS2345错误应该就彻底消失啦!

内容的提问来源于stack exchange,提问作者user15361826

火山引擎 最新活动