Javascript Typescript:Type';X';没有为签名提供匹配项';(prevState:未定义):未定义';

Javascript Typescript:Type';X';没有为签名提供匹配项';(prevState:未定义):未定义';,javascript,reactjs,typescript,react-native,Javascript,Reactjs,Typescript,React Native,所以我有一个使用TypeScript的React本机应用程序,有一个让我抓狂的错误 基本上,有一个可搜索的列表。它由一个值数组启动。一旦用户在搜索栏中键入,启动的数组将被过滤,并返回一个更新的数组 但是,TypeScript给了我一个错误:类型“{id:string;name:string;selected:boolean;}[]”没有为签名(prevState:undefined):undefined)提供匹配项。 我很困惑,因为我不知道这个'(prevState:undefined):und

所以我有一个使用TypeScript的React本机应用程序,有一个让我抓狂的错误

基本上,有一个可搜索的列表。它由一个值数组启动。一旦用户在搜索栏中键入,启动的数组将被过滤,并返回一个更新的数组

但是,TypeScript给了我一个错误:
类型“{id:string;name:string;selected:boolean;}[]”没有为签名(prevState:undefined):undefined)提供匹配项。

我很困惑,因为我不知道这个
'(prevState:undefined):undefined'
实际上来自何处以及为什么。你知道我做错了什么吗?非常感谢您的帮助

代码如下:

const defaultChoices = [
  {
    id: '1',
    name: 'default',
    selected: false,
  },
];

let choicesList;

const getChoicesList = () => {
  if (listName === 'include') {
    choicesList = Object.values(includeChoices).map(choice => ({
      ...choice,
    }));
  } else if (listName === 'exclude') {
    choicesList = Object.values(excludeChoices).map(choice => ({
      ...choice,
    }));
  }
};

const [filteredChoicesList, setFilteredChoicesList] = useState(choicesList);

useEffect(() => {
  getChoicesList();
}, []);

useEffect(() => {
    let choices = defaultChoices;

    if (listName === 'include') {
      choices = includeChoices;
    } else if (listName === 'exclude') {
      choices = excludeChoices;
    } else {
      choices = defaultChoices;
    }

    const newChoices = choices.filter(item => {
      const itemData = `${item.name.toUpperCase()}`; // ignore Uppercase/Lowercase and make equal
      const textData = query.toUpperCase();
      return itemData.indexOf(textData) > -1;
    });

    setFilteredChoicesList(newChoices); // error occurs for "newChoices"
  }, [effect]);

问题是,您已将
选项列表设置为未定义。并且在组件的第一次初始化时调用
getChoicesList
,但在此之前,将在
choicesList
未定义的位置设置状态us

将代码部分更新为

let choicesList: any[] = [];

const getChoicesList = () => {
  let data: any[] = [];
  if (listName === 'include') {
    data = Object.values(includeChoices).map(choice => ({
      ...choice,
    }));
  } else if (listName === 'exclude') {
    data = Object.values(excludeChoices).map(choice => ({
      ...choice,
    }));
  }
  return data;
};

const [filteredChoicesList, setFilteredChoicesList] = useState<any[]>(choicesList);

useEffect(() => {
  const updatedList = getChoicesList();
  setFilteredChoicesList(updatedList)
}, []);

let choicesList:any[]=[];
常量getChoiceList=()=>{
let数据:任意[]=[];
如果(listName=='include'){
数据=对象.值(包括选项).map(选项=>({
…选择,
}));
}else if(listName==='exclude'){
数据=对象.值(不包括选项).map(选项=>({
…选择,
}));
}
返回数据;
};
常量[filteredChoicesList,setFilteredChoicesList]=useState(choicesList);
useffect(()=>{
const updatedList=getChoiceList();
setFilteredChoicesList(更新列表)
}, []);
现在,您将拥有包含所需数据的
filteredChoicesList
,您不应该有任何编译错误。
另一件事是,创建一个接口,并在状态和定义时用该接口替换
any

不确定这是否会解决错误,但您可能应该将
choicesList
(从而将状态数组)初始化为
[]
。另外,不是Typescript专家,但在声明变量和参数时不应该声明类型吗?请给出一个例子,代码看起来非常复杂。例如,为什么在一行中使用
`${item.name.toUpperCase()}`
,而在下一行中使用(更简单的)等效的
query.toUpperCase()
?包含或排除项目的逻辑不也应该逆转比较吗?很高兴它起到了作用!